Avi*_*sel 5 python postgresql bulkinsert sqlalchemy
我正在尝试使用 SQLAlchemy 的插入和执行方法,并将字典列表作为值,并获取插入的 id。数据库是Postgres,应该支持RETURNING。
代码看起来或多或少像这样:
table = MyThing.__table__
insert_stmt = table.insert().values({"name": bindparam("name_val")}).returning(table.c.id)
values = [{"name_val": "a"}, {"name_val": "b"}]
result = session.execute(insert_stmt, values).fetchall()
Run Code Online (Sandbox Code Playgroud)
(为了可读性和一些混淆而进行了精简)
当值列表大于 1 时(如上例所示),我得到:
sqlalchemy.exc.ProgrammingError:(psycopg2.ProgrammingError)没有要获取的结果
但是当列表只有一个值时,新的 id 会正确返回。
我知道我可能在使用返回方式时错过了一些东西,但我不知道是什么。
您在第二个参数中传递给 的值列表中会重复相同的绑定参数session.execute。
values插入多个值时应该是一个列表,并且 sqlalchemy 默认情况下会绑定参数,除非literal_binds将选项设置True为 以便在不显式绑定参数的情况下安全地进行操作
values = [{"name_val": "a"}, {"name_val": "b"}]
insert_stmt = table.insert().values(values).returning(table.c.id)
result = session.execute(insert_stmt).fetchall()
Run Code Online (Sandbox Code Playgroud)
假设您想保留现有的显式绑定, values为插入语句传递的必须是关键字参数。您现有的查询将更新如下:
bind_params = [{"name_val": "a"}, {"name_val": "b"}]
insert_stmt = table.insert().values(name_val=bindparam("name_val")).returning(table.c.id)
result = session.execute(insert_stmt, bind_params).fetchall()
Run Code Online (Sandbox Code Playgroud)