Как вставить ObjectId в PostgreSQL

Я пишу скрипт, в котором я извлекаю данные из MongoDB и выгружаю их в PostgreSQL. Все работает нормально, но когда я пытаюсь вставить ObjectId MongoDBs _id, выдает следующую ошибку.

(psycopg2.errors.SyntaxError) завершающий мусор после числового литерала в или рядом с "63711d"

Я хочу вставить _id в базу данных PostgreSQL в качестве первичного ключа, чтобы не было повторяющихся строк.

Запрос, сгенерированный psycopg2, выглядит следующим образом

[SQL: INSERT INTO employees (_id, candidate_last_name, candidate_first_name, candidate_state, candidate_experience, candidate_relocation, candidate_skills, candidate_specialty)VALUES (6375364d1ad809ab6108a544, NULL, NULL, NULL, NULL, NULL, NULL, NULL), (6375364d1ad809ab6108a545, NULL, NULL, NULL, NULL, NULL, NULL, NULL)]

Поле _id в PostgreSQL — это VARCHAR.

Код, который я использую, выглядит следующим образом:

def insert_psql(db, table_name: str, fields: dict, data: list):

    new_fields = {}
    for field in fields:
        new_fields[field.replace('.', '_')] = fields[field]
    insert_query = f'INSERT INTO {table_name} ('
    insert_query += ', '.join(new_fields.keys()) + ')'
    insert_query += 'VALUES '
    for i, row in enumerate(data):
        insert_query += '('
        for j, field in enumerate(fields):
            if not row.get(field):
                insert_query += 'NULL'
            else:
                insert_query += f'{str(row.get(field))}'
            if not j == len(fields) - 1:
                insert_query += ', '
        insert_query += ')'
        if not i == len(data) - 1:
            insert_query += ', '
    # print(insert_query)
    try:
        db.execute(insert_query)
        db.commit()
    except Exception as e:
        print(e)

Поля dict — это словарь, содержащий имена столбцов и их типы данных в качестве значения. Список данных список записей для вставки

Как вы генерируете оператор вставки? Если это VARCHAR в PostgreSQL, то значение должно быть заключено в кавычки в сгенерированном операторе.

Mark Rotteveel 21.11.2022 13:10

Не могли бы вы добавить код, который генерирует этот запрос, в свой пост?

Pompedup 21.11.2022 13:17

Я динамически генерирую запрос на вставку. Я добавил код для этого в сообщение.

Abdulaziz Ibrahim 21.11.2022 13:28

@MarkRotteveel есть идеи, как решить эту ошибку?

Abdulaziz Ibrahim 21.11.2022 14:45

Вы не должны создавать операторы посредством конкатенации. Используйте подготовленные операторы с параметрами. Ваш текущий код чрезвычайно уязвим для SQL-инъекций.

Mark Rotteveel 22.11.2022 10:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
515
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш код ошибки: trailing junk after numeric literal at or near "63711d"

В частности, это предупреждение о неожиданных символах после числовых литералов. В напечатанном тексте мы видим пять цифр (63711), за которыми следует символ a. Похоже, что код пытается проанализировать этот набор символов как число и не может этого сделать, как только находит первый альфа-символ.

Действительно, когда мы смотрим на сгенерированный оператор SQL, мы видим это:

VALUES (6375364d1ad809ab6108a544,

Если вы пытаетесь вставить строку (VARCHAR), то @Mark Rotteveel сказал, что вам нужно сделать в самом первом комментарии к этому вопросу:

Если это VARCHAR в PostgreSQL, то значение должно быть заключено в кавычки в сгенерированном операторе.

Вместо этого ваше утверждение INSERT должно иметь что-то вроде этого:

VALUES ('6375364d1ad809ab6108a544',

Отредактировано для использования одинарных кавычек вместо двойных. Кроме того, Марк поднимает еще одно важное предупреждение об этом подходе в целом здесь.

Он должен выглядеть как VALUES ('6375364d1ad809ab6108a544', (одинарные, а не двойные кавычки).

Mark Rotteveel 22.11.2022 10:23

Упс, исправлено! Также указал на ваше предупреждение о подходе в целом в комментариях.

user20042973 22.11.2022 14:24

Другие вопросы по теме