为什么游标在 mysqlclient 中不是可选的?
Why aren't cursors optional in mysqlclient?
我是 Python 和 Flask 的新手,在研究这些示例时,我忍不住注意到游标。在此之前,我在 PHP 中编程,我从不需要游标。所以我想知道:什么是游标,为什么在这些代码示例中如此频繁地使用游标?
但是无论我转向哪里,我都没有看到明确的结论和很多警告:
- Wikipedia:"Fetching a row from the cursor may result in a network round trip each time",以及"Cursors allocate resources on the server, such as locks, packages, processes, and temporary storage."
- Whosebug:请参阅 AndreasT 的回答。
- The Island of Misfit Cursors: "A good developer is never reluctant to use a tool only because it's often misused by others."
最重要的是,我了解到 MySQL 不支持游标 !
看起来 mysqlclient
库中唯一不使用游标的代码是 _msql
模块,出于兼容性原因,作者反复警告不要使用它:"If you want to write applications which are portable across databases, use MySQLdb, and avoid using this module directly."
好吧,我希望我已经充分解释和支持了我的困境。这里有两个困扰我的大问题:
- 既然 MySQL 不支持游标,那么在 Cursor class 层次结构上构建整个东西的意义何在?
- 为什么游标在
mysqlclient
中不是可选的?
您混淆了 database-engine 级游标和 Python db-api 游标。第二个仅存在于 Python 代码级别,不一定与 database-level 代码级别相关。
在 Python 级别,游标是封装查询及其结果的一种方式。此抽象级别允许为不同供应商提供简单、可用且 通用 api。给定供应商的实际实现是否依赖于 database-level 游标是一个完全不同的问题。
长话短说:这里有两个截然不同的概念:
- 数据库(服务器)游标,存在于某些但并非所有 SQL 引擎中的功能
- db api(客户端)游标(如 pep 249 中所定义),用于执行查询并最终获取结果。
db api 游标之所以如此命名,是因为它们在概念上与数据库游标有一些相似之处,但在技术上完全无关。
至于为什么 mysqlclient 以这种方式工作,很简单:它实现了 pep 249,即 Python SQL 数据库的 community-defined API客户。
我是 Python 和 Flask 的新手,在研究这些示例时,我忍不住注意到游标。在此之前,我在 PHP 中编程,我从不需要游标。所以我想知道:什么是游标,为什么在这些代码示例中如此频繁地使用游标?
但是无论我转向哪里,我都没有看到明确的结论和很多警告:
- Wikipedia:"Fetching a row from the cursor may result in a network round trip each time",以及"Cursors allocate resources on the server, such as locks, packages, processes, and temporary storage."
- Whosebug:请参阅 AndreasT 的回答。
- The Island of Misfit Cursors: "A good developer is never reluctant to use a tool only because it's often misused by others."
最重要的是,我了解到 MySQL 不支持游标 !
看起来 mysqlclient
库中唯一不使用游标的代码是 _msql
模块,出于兼容性原因,作者反复警告不要使用它:"If you want to write applications which are portable across databases, use MySQLdb, and avoid using this module directly."
好吧,我希望我已经充分解释和支持了我的困境。这里有两个困扰我的大问题:
- 既然 MySQL 不支持游标,那么在 Cursor class 层次结构上构建整个东西的意义何在?
- 为什么游标在
mysqlclient
中不是可选的?
您混淆了 database-engine 级游标和 Python db-api 游标。第二个仅存在于 Python 代码级别,不一定与 database-level 代码级别相关。
在 Python 级别,游标是封装查询及其结果的一种方式。此抽象级别允许为不同供应商提供简单、可用且 通用 api。给定供应商的实际实现是否依赖于 database-level 游标是一个完全不同的问题。
长话短说:这里有两个截然不同的概念:
- 数据库(服务器)游标,存在于某些但并非所有 SQL 引擎中的功能
- db api(客户端)游标(如 pep 249 中所定义),用于执行查询并最终获取结果。
db api 游标之所以如此命名,是因为它们在概念上与数据库游标有一些相似之处,但在技术上完全无关。
至于为什么 mysqlclient 以这种方式工作,很简单:它实现了 pep 249,即 Python SQL 数据库的 community-defined API客户。