我正在按照SQLAlchemy文档这里的指引撰写一个批量更新和插入(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的"on conflict"部分时。
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上的其他问题(例如这里),但似乎找不到解决以上错误的方法。
AttributeError:'Insert'对象没有属性'excluded'
的错误。我的插入语句如下:insert_statement = insert(table).values(items)
其中table是DeclarativeMeta类型,items是字典列表。任何建议将不胜感激。 - Mikefrom sqlalchemy.dialects.postgresql import insert
而不是from sqlalchemy import insert
。天啊。 - Mike