psycopg2 dynamici c вставка проблем с запросом, синтаксическая ошибка в или около идентификатора - PullRequest
0 голосов
/ 21 апреля 2020

Я пишу программу для извлечения большого количества данных из другого источника и записи их в базу данных Postgres. Мне нужна функция, которая принимает таблицу назначения и словарь с переменными полями, которые нужно добавить, а затем вставляет их по мере необходимости. Кажется, это должно быть достаточно просто, но я сталкиваюсь с проблемами при генерации запроса на вставку. Примеры, которые я нашел в Интернете, являются частичными, устаревшими или просто не работают, когда я изменяю их для своих данных.

Вот простая версия, которую я собрал, чтобы разобраться с ней. Я пробовал много вариантов этого, так что, вероятно, не так чисто, как должно быть в данный момент. Такое ощущение, что есть что-то действительно простое, что я просто упускаю, но если это так, я просто не вижу этого.

def insert_record():

    table = "test"
    record = {"name": "Jack", "id": 1}
    fields = record.keys()
    values = ", ".join(str(n) for n in record.values())

    query = sql.SQL("INSERT INTO {} ({}) VALUES ({});".format(
                    sql.Identifier(table),
                    sql.SQL(",").join(map(sql.Identifier, fields)),
                    sql.SQL(",").join(sql.Placeholder() * len(fields))
                    ))
    cursor = connection.cursor()

    print(query.as_string(connection))
    try:
        cursor.execute(query, (values,))
        connection.commit()
    except (Exception, psycopg2.DatabaseError) as error:
        print(error)
    cursor.close()

Это возвращает ошибку:

syntax error at or near "'test'"
LINE 1: INSERT INTO Identifier('test') (Composed([Identifier('name')...

Это выглядит как будто он фактически не форматирует запрос по какой-либо причине, так как функция as_string также возвращает неотформатированный:

"INSERT INTO Identifier('test') (Composed([Identifier('name'), SQL(','), Identifier('id')])) VALUES (Composed([Placeholder(''), SQL(','), Placeholder('')]));"

Есть предложения о том, как это исправить, или лучшие способы обработки динамических c запросов в целом?

edit : вот мое утверждение импорта

import psycopg2
from psycopg2 import extras, Error, sql
...