Python pyodbc 游标与数据库游标

Python pyodbc cursor vs database cursor

我每天都使用 python,重点放在数据库工作上。

使用 pyodbc 我的标准开始类似于

connection_hostname = pyodbc.connect('connection_string')
cursor_hostname = connection_hostname.cursor()
command_hostname = 'select * from everything_forever;'
cursor_hostname.execute('command_hostname')

如果我需要为另一个查询重用游标而不是创建新游标,我可以像这样存储第一个查询的结果集:

results_from_query = cursor_hostname.fetchall()

然后继续前进。

到目前为止,这种方法对我来说效果很好。

最近,我换了工作,当我演示上述技术时,我的一些通常使用 GUI 来处理他们的数据库的新同事开始恐慌。引起他们注意的是 cursor 关键字。我知道游标是 DB 的一大禁忌,因为它们表明逻辑不是建立在集合论中的,倾向于将主机推入 low/zero 并行化级别和 RBAR 类型操作,但我不相信 ODBC 游标我在上面声明的是我们在 SQL 服务器工程和管理方面想到的游标。

有人可以解释这些 ODBC 游标和 SQL 服务器类型游标之间的区别吗(假设我是正确的,它们是不同的)?

如果我不正确,请赐教并告诉我如何更有效地与我的数据库交互。

为什么不能像

这样直接从连接执行
connection_hostname.execute(command_hostname)

我觉得拥有 ODBC 游标结构与允许多个游标通过同一连接以降低连接成本等有关。离基地远吗?

数据库游标受到 DBA 的辱骂和不信任,通常是有充分理由的。它们通常是性能问题的根源,set-based 方法几乎总是更好。

http://www.databasejournal.com/features/mssql/article.php/3896206/What-Every-DBA-Ought-to-Know-About-SQL-Server-Cursors-and-Their-Alternatives.htm 例如说:

"At my work place, cursors are banned in our SQL Server standards. In order to use a cursor, we have to prove that the performance of the cursor is better than processing the rows another way. "

对于over-simplify,你可能会向紧张的朋友解释说python游标实际上是其他语言所称的记录集或结果集的同义词,而且他们的GUI工具也使用cursors/recordsets(但不在数据库上创建游标!)。

difference between cursor and connection objects