169

我对Python 的 sqlite3 模块(以及一般的 SQL)完全陌生,这完全让我难过。大量缺乏对cursor对象的描述(更确切地说,它们的必要性)似乎也很奇怪。

这段代码是首选的做事方式:

import sqlite3
conn = sqlite3.connect("db.sqlite")
c = conn.cursor()
c.execute('''insert into table "users" values ("Jack Bauer", "555-555-5555")''')
conn.commit()
c.close()

这个不是,即使它工作得一样好并且没有(看似毫无意义)cursor

import sqlite3
conn = sqlite3.connect("db.sqlite")
conn.execute('''insert into table "users" values ("Jack Bauer", "555-555-5555")''')
conn.commit()

谁能告诉我为什么我需要一个cursor
这似乎是毫无意义的开销。对于我的脚本中访问数据库的每个方法,我应该创建和销毁一个cursor
为什么不直接使用connection对象?

4

5 回答 5

77

在我看来,这只是一个误用的抽象。db 游标是一种抽象,用于数据集遍历。

来自维基百科关于主题的文章

在计算机科学和技术中,数据库游标是一种控制结构,可以遍历数据库中的记录。游标有助于与遍历一起进行后续处理,例如数据库记录的检索、添加和删除。遍历的数据库游标特性使游标类似于编程语言的迭代器概念。

和:

游标不仅可以用于将数据从 DBMS 提取到应用程序中,还可以用于标识表中要更新或删除的行。SQL:2003 标准为此目的定义了定位更新和定位删除 SQL 语句。此类语句不使用带有谓词的常规 WHERE 子句。相反,游标标识行。游标必须打开并且已经通过 FETCH 语句定位在行上。

如果您查看Python sqlite module 上的文档,您会发现cursor即使是一个CREATE TABLE语句也需要一个 python 模块,因此它用于仅一个connection对象就足够的情况——正如 OP 正确指出的那样。这种抽象不同于人们对 db 游标的理解,因此,用户的困惑/沮丧。不管效率如何,这只是概念上的开销。如果在文档中指出 python 模块cursor与 SQL 和数据库中的游标有点不同,那就太好了。

于 2012-11-30T04:52:28.517 回答
52

根据官方文档 connection.execute()是创建中间光标对象的非标准快捷方式:

Connection.execute
这是一个非标准的快捷方式,它通过调用 cursor() 方法创建一个游标对象,使用给定的参数调用游标的 execute() 方法,并返回游标。

于 2011-07-02T10:47:13.233 回答
46

您需要一个游标对象来获取结果。您的示例有效,因为它是一个INSERT,因此您不会尝试从中获取任何行,但是如果您查看sqlite3docs,您会注意到连接对象上没有任何.fetchXXXX方法,所以如果您尝试这样做aSELECT没有游标,您将无法获取结果数据。

游标对象允许您跟踪哪个结果集是哪个结果集,因为可以在您完成获取第一个结果之前运行多个查询。

于 2011-06-11T19:46:35.323 回答
38

12.6.8. 高效使用sqlite3

12.6.8.1。使用快捷方式

使用 Connection 对象的nonstandard execute()和方法executemany()executescript()您的代码可以更简洁地编写,因为您不必显式地创建(通常是多余的) Cursor 对象。相反,Cursor 对象是隐式创建的,并且这些快捷方法返回光标对象。这样,您可以执行 SELECT 语句并直接使用对 Connection 对象的一次调用直接对其进行迭代。

sqlite3 文档;强调我的。)

为什么不只使用连接对象?

因为连接对象的那些方法是非标准的,即它们不是Python 数据库 API 规范 v2.0 (PEP 249) 的一部分。

只要您使用 Cursor 对象的标准方法,您就可以确定,如果您切换到遵循上述规范的另一个数据库实现,您的代码将是完全可移植的。也许您只需要更改import线路。

但是,如果您使用 ,connection.execute则切换可能不会那么简单。这是您可能要改用的主要原因cursor.execute

但是,如果您确定不会切换,我会说connection.execute走捷径并“高效”是完全可以的。

于 2015-05-26T16:47:59.633 回答
4

它使我们能够通过与数据库的相同连接来拥有多个独立的工作环境。

于 2018-12-02T10:31:54.663 回答