为什么SQLAPI有单独的连接和游标对象?

2024-06-10 09:24:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

查询和结果获取是用游标对象完成的,而不是连接。 据我所见,这是pythonsqlapi的标准设置。(显然这不是指向结果集中某一行的常用“游标”)相反,PHP的mysqliPDO库将query()方法直接放在connection对象上。你知道吗

那么,为什么Python中的两步排列以及其他任何一个这样工作的库呢?维护单独的连接和游标对象的用例是什么?你知道吗


Tags: path对象数据库标准connectconnectionquerysqlite3
1条回答
网友
1楼 · 发布于 2024-06-10 09:24:00

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

  1. 对connection对象执行查询,它将返回一个新的results对象。

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

这两种安排之间没有任何显著差异,Python选择了第二种方法(results对象称为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风格非常相似。你知道吗

相关问题 更多 >