python - 为什么 sql API 有单独的连接和游标对象?

标签 python sql

在我开始使用 Python 中的 sqlite3 库之前,我需要建立到数据库的连接和连接的游标。

connection = sqlite3.connect(path)
cursor = connection.cursor()

查询和结果获取是通过游标对象完成的,而不是连接。 据我所见,这是 Python SQL API 的标准设置。 (显然,这不是通常指向结果集中一行的“游标”。)相比之下,PHP 的 mysqliPDO 库将一个 query( ) 直接在连接对象上的方法。

那么为什么在 Python 和任何其他以这种方式工作的库中采用两步安排?维护单独的连接和游标对象的用例是什么?

最佳答案

这很可能只是一个任意的设计决定。大多数数据库 API 都有某种类型的对象来表示查询结果,然后您可以遍历这些对象以获取每一行。基本上有两种方法可以做到这一点:

  1. 对连接对象执行查询,它返回一个新的结果对象。

  2. 创建一个结果对象,然后对该对象执行查询以填充它。

这两种排列方式并无明显区别,Python 选择了第二种方式(结果对象称为cursor)。

也许第一种方法看起来更合乎逻辑,因为大多数 cursor 方法(例如 .fetchone())只有在您执行查询之后才真正有用。另一方面,这种设计将仅表示数据库连接的对象与表示特定查询的所有方面的对象分开。 Python cursor 类确实有一些适用于特定查询的方法,必须在 .execute() 之前调用:.setinputsizes().setoutputsize() 为查询预分配缓冲区。

Python 在这种风格上并不是独一无二的。它的 cursor 与现代 PHP API 的 mysqli_stmtPDOStatement 类没有太大区别。在 PDO 中,在调用 PDO::prepare() 之前,您不会得到语句,但是对于 mysqli,您可以选择:您可以调用 mysql::prepare()获取语​​句,或者可以使用 mysqli::stmt_init() 获取新语句,然后调用 prepare()execute()在这个对象上。这与 Python 风格非常相似。

关于python - 为什么 sql API 有单独的连接和游标对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40294458/

相关文章:

c++ - 帮助我将替换文件名扩展名的 Python 代码翻译成 C++

python - 在python命令行输入python命令

mysql - 在同一列上选择多个位置

MySQL - 访问表总和并与另一个表进行比较?

sql - 打开跟踪标志 460 并不会给出更好的错误消息

php - 用户名已被使用

python - 提高 python 正则表达式的性能

python - 在 for 循环的每次迭代中使用不同的除数创建可整除数字的列表

python 从源代码 : cannot build optional module sqlite3 构建

mysql - 我想将所有金额添加为总计...请帮助我如何为此编写查询