Я слежу за документацией SQLAlchemy здесь , чтобы написать массовую инструкцию по внедрению с Postgres. Для демонстрации у меня есть простая таблица MyTable
:
class MyTable(base):
__tablename__ = 'mytable'
id = Column(types.Integer, primary_key=True)
test_value = Column(types.Text)
Создать общий оператор вставки достаточно просто:
from sqlalchemy.dialects import postgresql
values = [{'id': 0, 'test_value': 'a'}, {'id': 1, 'test_value': 'b'}]
insert_stmt = postgresql.insert(MyTable.__table__).values(values)
Проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь добавить часть upsert в конфликт.
update_stmt = insert_stmt.on_conflict_do_update(
index_elements=[MyTable.id],
set_=dict(data=values)
)
Попытка выполнить этот оператор приводит к ProgrammingError
:
from sqlalchemy import create_engine
engine = create_engine('postgres://localhost/db_name')
engine.execute(update_stmt)
>>> ProgrammingError: (psycopg2.ProgrammingError) can't adapt type 'dict'
Я думаю, что мое недоразумение заключается в построении утверждения с помощью метода on_conflict_do_update
. Кто-нибудь знает, как построить это утверждение? Я смотрел на другие вопросы о StackOverflow (например, здесь ), но я не могу найти способ исправить вышеуказанную ошибку.