pymssql的cursor.executemany()的执行顺序

时间:2019-07-26 13:30:37

标签: python python-3.x pymssql

cursor.executemany(...)模块的pymssql是否有保证的执行顺序?

import pymssql

# Example retrieved from: http://pymssql.org/en/stable/pymssql_examples.html

# ...
conn = pymssql.connect(server, user, password, "tempdb")
cursor = conn.cursor()

# ...
cursor.executemany(
    "INSERT INTO persons VALUES (%d, %s, %s)",
    [(1, 'John Smith', 'John Doe'),
     (2, 'Jane Doe', 'Joe Dog'),
     (3, 'Mike T.', 'Sarah H.')])
conn.commit()
conn.close()

另请参阅:http://pymssql.org/en/stable/pymssql_examples.html

在实际情况下,我需要以特定顺序更新值(我有一个有序的元组数组),并希望避免使用cursor.execute(...)一次执行那些更新。


像PEP 249这样的要求非常开放...

  

准备数据库操作(查询或命令),然后对序列seq_of_parameters中找到的所有参数序列或映射执行该操作。

     

模块可以通过多次调用.execute()方法或使用数组操作让数据库在一次调用中将整个序列作为一个整体来自由地实现此方法。

https://www.python.org/dev/peps/pep-0249/#executemany

这又引发了一个问题... pymssql的PEP 249实现是否通过cursor.execute(...)逐个执行?

1 个答案:

答案 0 :(得分:2)

def executemany(self, operation, params_seq):
    self.description = None
    rownumber = 0
    for params in params_seq:
        self.execute(operation, params)
        # support correct rowcount across multiple executes
        rownumber += self._rownumber
    self._rownumber = rownumber

根据源代码,executemany函数仅迭代给定序列并调用execute

ref:https://github.com/pymssql/pymssql/blob/891b20e29e4e247c17b202e8e34e5c739b6090ef/src/pymssql.pyx#L472