Python pyodbc 游标与数据库游标

Posted

技术标签:

【中文标题】Python pyodbc 游标与数据库游标【英文标题】:Python pyodbc cursor vs database cursor 【发布时间】:2017-07-06 08:12:05 【问题描述】:

我每天都在使用 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 来说是一个很大的禁忌,因为它们表明逻辑不是建立在集合论中的,倾向于将主机推入低/零级别的并行化和 RBAR 类型操作,但我不相信 ODBC 游标我'上面声明的 m 与我们戴上 SQL Server 工程和管理帽子时想到的游标相同。

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

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

为什么你不能直接从像这样的连接执行

connection_hostname.execute(command_hostname)

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

【问题讨论】:

我也有这个问题。在获取行时,我有点看到需要游标。但是在执行 INSERT 或 UPDATE 时呢?我们真的需要 pyodbc 游标吗?为什么? 【参考方案1】:

数据库游标受到 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 工具也使用游标/记录集(但不创建游标在数据库上!)。

difference between cursor and connection objects

【讨论】:

好答案。谷歌“数据库 RBAR”,让自己了解为什么避免滥用游标很重要。如果处理足够小的表,您将看不到区别。一旦你说 10k 或更多,请注意!光标正常时的快速示例:将它们发送到不接受批处理的外部 API(您别无选择,尽管先保存到文件可能更好);不正常时:如果 column1 > column2,则将 column3 更新为某个值(这应该通过整个表上的单个更新语句来完成)。

以上是关于Python pyodbc 游标与数据库游标的主要内容,如果未能解决你的问题,请参考以下文章

Pyodbc 更新游标

Python数据库连接以及游标关闭问题

pyodbc简单使用

在 Access 中使用 pyodbc 处理日期,给出“参数太少”错误

MySQL与python交互

python使用游标访问数据