我在读取sqlalchemy中通过输出语句创建的结果时遇到了问题。我最初在读取插入行的primarykey时遇到问题,但通过使用以下代码将autocommit设置为false,使其正常工作:
sqlString = """ INSERT INTO workflow.{table} ({columns})
OUTPUT Inserted.{primaryKey}
VALUES ({values})""".format(table=self.table, columns=columns, primaryKey=self.primaryKey, values=values)
with self.dict_db['engine'].connect().execution_options(autocommit=False) as connection:
result = connection.execute(sqlString)
primaryKey = result.fetchone()[0]
result.cursor.commit()
现在我正在写一个delete语句,我想做一些类似的事情,但是在遍历结果之后,cursor对象被设置为none,这样我就不能再提交了。我已经尝试了使用for循环在 results
以及 results.fetchall()
在这两种情况下,我都不能提交,因为游标是none。以下是我的代码:
sqlString = """ DELETE FROM workflow.{table} OUTPUT Deleted.{primaryKey} {where} """.format(table=self.table, primaryKey=self.primaryKey, where=whereStatement)
with self.dict_db['engine'].connect().execution_options(autocommit=False) as connection:
result = connection.execute(sqlString)
# cursor exists
primaryKeyList = [item[0] for item in result.fetchall()]
# cursor is now None
result.cursor.commit()
这不起作用的事实让我重新思考这两种db执行。我在这里是做错了什么,还是遗漏了一些小的语法?
注:以下为 self.dict_db['engine']
是用sqlalchemy create\u引擎创建的
1条答案
按热度按时间xbp102n01#
使用连接创建事务(使用
connection.begin()
并承诺。更妙的是,这个物体从
connection.begin()
实现上下文管理器协议,因此您可以使用此更简单的版本,并确保在没有异常的情况下提交事务,或者在出现以下情况时回滚事务:有关更多详细信息,请参阅使用sqlalchemy文档中的事务。