为什么游标在 mysqlclient 中不是可选的?

Why aren't cursors optional in mysqlclient?

我是 Python 和 Flask 的新手,在研究这些示例时,我忍不住注意到游标。在此之前,我在 PHP 中编程,我从不需要游标。所以我想知道:什么是游标,为什么在这些代码示例中如此频繁地使用游标?

但是无论我转向哪里,我都没有看到明确的结论和很多警告:

最重要的是,我了解到 MySQL 不支持游标

看起来 mysqlclient 库中唯一不使用游标的代码是 _msql 模块,出于兼容性原因,作者反复警告不要使用它:"If you want to write applications which are portable across databases, use MySQLdb, and avoid using this module directly."

好吧,我希望我已经充分解释和支持了我的困境。这里有两个困扰我的大问题:

  1. 既然 MySQL 不支持游标,那么在 Cursor class 层次结构上构建整个东西的意义何在?
  2. 为什么游标在 mysqlclient 中不是可选的?

您混淆了 database-engine 级游标和 Python db-api 游标。第二个仅存在于 Python 代码级别,不一定与 database-level 代码级别相关。

在 Python 级别,游标是封装查询及其结果的一种方式。此抽象级别允许为不同供应商提供简单、可用且 通用 api。给定供应商的实际实现是否依赖于 database-level 游标是一个完全不同的问题。

长话短说:这里有两个截然不同的概念:

  1. 数据库(服务器)游标,存在于某些但并非所有 SQL 引擎中的功能
  2. db api(客户端)游标(如 pep 249 中所定义),用于执行查询并最终获取结果。

db api 游标之所以如此命名,是因为它们在概念上与数据库游标有一些相似之处,但在技术上完全无关

至于为什么 mysqlclient 以这种方式工作,很简单:它实现了 pep 249,即 Python SQL 数据库的 community-defined API客户。