sqlalchemy在使用fetchall方法迭代结果之后提交sql执行

ijnw1ujt  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(383)

我在读取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引擎创建的

xbp102n0

xbp102n01#

使用连接创建事务(使用 connection.begin() 并承诺。

with self.dict_db['engine'].connect().execution_options(autocommit=False) as connection:
  txn = connection.begin()
  result = txn.execute(sqlString)
  # I'm not sure a cursor exists here, the result doesn't need one for fetchall()
  primaryKeyList = [item[0] for item in result.fetchall()]
  txn.commit()

更妙的是,这个物体从 connection.begin() 实现上下文管理器协议,因此您可以使用此更简单的版本,并确保在没有异常的情况下提交事务,或者在出现以下情况时回滚事务:

with self.dict_db['engine'].connect().begin() as connection: 
  # connection here is really a Transaction, but all the connection methods work the same
  result = connection.execute(sqlString)
  primaryKeyList = [item[0] for item in result.fetchall()]
  # transaction is committed as the with block exits

有关更多详细信息,请参阅使用sqlalchemy文档中的事务。

相关问题