第一个答案-关于“防止自动关闭”。
SQLAlchemy使用insert运行DBAPI
execute()或executemany(),并且不执行任何选择查询。因此,您遇到的异常是预期的行为。执行插入查询后返回的ResultProxy对象包装了不允许对其执行的DB-
API游标
.fetchall()。一旦
.fetchall()失败,ResultProxy将向用户返回您看到的异常。
在插入/更新/删除操作之后,您可以获得的唯一信息是受影响的行数或自动递增后的主键值(取决于数据库和数据库驱动程序)。
如果您的目标是接收此类信息,请考虑检查ResultProxy方法和属性,例如:
- .inserted_primary_key
- .last_inserted_params()
- .lastrowid
- 等等
第二个答案-关于“如何进行批量插入/更新并获得结果行”。
使用DBAPI进行单次插入查询时,无法加载已插入的行。您用于批量插入/更新的SQLAlchemy SQL expression
API也未提供此类功能。SQLAlchemy运行DBAPI
executemany()调用,并依赖于驱动程序的实现。有关详细信息,请参见本节文档。
解决方案是设计表的方式,使每条记录都具有用于标识记录的自然键(以独特方式标识记录的列值的组合)。因此,插入/更新/选择查询将能够针对一条记录。完成后,可以先进行批量插入/更新,然后再通过自然键进行选择查询。因此,您不需要知道自动递增的主键值。
另一种选择:可能是您可以使用SQLAlchemy对象关系API创建对象-然后,SQLAlchemy可能会尝试为您执行executemany来优化插入。使用Oracle
DB时对我有用。开箱即用的更新不会有任何优化。检查此SO问题以获取有效的批量更新建议



