Я пишу программу для извлечения большого количества данных из другого источника и записи их в базу данных 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