Python pyodbc游标与数据库游标对比

9

我每天都在进行与数据库相关的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与其DB一起工作的新同事,在我展示以上技术时开始恐慌。他们感到不安的是游标关键字。我了解游标在DB中是个大忌,因为它们表示不基于集合论的逻辑,往往会将主机推入低/零并行级别和RBAR类型操作中,但我不认为我声明的ODBC游标与我们戴上SQL Server工程师和管理员帽子时所考虑的游标相同。

有人能解释一下这些ODBC游标和SQL Server类型游标之间的区别吗(假设我正确地认为它们是不同的)?

如果我不正确,请启迪我并告诉我如何更有效地与我的DB进行交互。

为什么不能直接从连接中执行,例如:

connection_hostname.execute(command_hostname)

我觉得保持ODBC游标结构不变是为了允许通过同一连接使用多个游标以降低连接成本等原因。这种想法是否太离谱了?


我也有这个问题。在获取行时,我有点看到需要光标的必要性。但是在执行INSERT或UPDATE时呢?我们真的需要一个pyodbc光标吗?为什么? - Marcos
1个回答

6
数据库游标经常受到DBA的鄙视和不信任,通常是有充分理由的。它们经常是性能问题的源头,而基于集合的方法几乎总是更好的选择。
例如http://www.databasejournal.com/features/mssql/article.php/3896206/What-Every-DBA-Ought-to-Know-About-SQL-Server-Cursors-and-Their-Alternatives.htm就指出:
“在我们的SQL Server标准中禁止使用游标。为了使用游标,我们必须证明游标的性能比其他处理行的方式更好。”
简单来说,你可以向紧张的朋友解释,Python游标实际上是其他语言中称为记录集或结果集的同义词,并且他们的GUI工具也在使用游标/记录集(但不会在数据库上创建游标!)。 游标对象和连接对象的区别

好的回答。谷歌“数据库RBAR”以了解为什么避免误用游标很重要。如果处理的表足够小,您将看不到任何区别。一旦达到10k或更多,请注意!游标是可以接受的快速示例:将它们发送到不接受批处理的外部API(尽管首先保存到文件可能更好);不可行时:如果column1> column2,则将column3更新为某个值(应通过整个表上的单个更新语句完成)。 - spioter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接