在我开始使用 Python 中的 sqlite3
库之前,我需要建立到数据库的连接和连接的游标。
connection = sqlite3.connect(path)
cursor = connection.cursor()
查询和结果获取是通过游标对象完成的,而不是连接。
据我所见,这是 Python SQL API 的标准设置。 (显然,这不是通常指向结果集中一行的“游标”。)相比之下,PHP 的 mysqli
或 PDO
库将一个 query( )
直接在连接对象上的方法。
那么为什么在 Python 和任何其他以这种方式工作的库中采用两步安排?维护单独的连接和游标对象的用例是什么?
最佳答案
这很可能只是一个任意的设计决定。大多数数据库 API 都有某种类型的对象来表示查询结果,然后您可以遍历这些对象以获取每一行。基本上有两种方法可以做到这一点:
对连接对象执行查询,它返回一个新的结果对象。
创建一个结果对象,然后对该对象执行查询以填充它。
这两种排列方式并无明显区别,Python 选择了第二种方式(结果对象称为cursor
)。
也许第一种方法看起来更合乎逻辑,因为大多数 cursor
方法(例如 .fetchone()
)只有在您执行查询之后才真正有用。另一方面,这种设计将仅表示数据库连接的对象与表示特定查询的所有方面的对象分开。 Python cursor
类确实有一些适用于特定查询的方法,必须在 .execute()
之前调用:.setinputsizes()
和.setoutputsize()
为查询预分配缓冲区。
Python 在这种风格上并不是独一无二的。它的 cursor
与现代 PHP API 的 mysqli_stmt
和 PDOStatement
类没有太大区别。在 PDO 中,在调用 PDO::prepare()
之前,您不会得到语句,但是对于 mysqli,您可以选择:您可以调用 mysql::prepare()
获取语句,或者可以使用 mysqli::stmt_init()
获取新语句,然后调用 prepare()
和 execute()
在这个对象上。这与 Python 风格非常相似。
关于python - 为什么 sql API 有单独的连接和游标对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40294458/