【发布时间】:2019-08-17 11:40:34
【问题描述】:
我正在按照 SQLAlchemy 文档 here 使用 Postgres 编写批量 upsert 语句。出于演示目的,我有一个简单的表格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 的其他问题(例如 here),但我似乎无法解决上述错误。
【问题讨论】:
标签: python postgresql sqlalchemy upsert