为什么在查询sqlite数据库时需要创build一个游标?

我对python的sqlite3模块(以及一般的SQL)完全陌生,而这完全让我感到困惑。 光标对象的描述(而不是他们的必要性)的描述也很奇怪。

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

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() 

这个不是,尽pipe它的工作原理也是一样的,没有(看似毫无意义的)光标:

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

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

只是一个错误的抽象,在我看来。 数据库游标是一个用于数据集遍历的抽象:

http://en.wikipedia.org/wiki/Cursor_%28databases%29

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

和:

游标不仅可以用于从数据库pipe理系统获取数据到应用程序中,而且还可以识别表中要更新或删除的行。 SQL:2003标准定义了定位更新,并为此定位了删除SQL语句。 这样的语句不使用带有谓词的常规WHERE子句。 而是一个游标标识该行。 游标必须通过FETCH语句打开并已经定位在一行上。

如果您检查了Python sqlite模块http://docs.python.org/2/library/sqlite3.html上的文档,您可以看到,即使对于“create table”语句也需要python模块游标,因此它用于仅仅连接对象就足够了的情况 – 正如OP所指出的那样。 这种抽象与人们对db光标的理解是不同的,也就是用户的困惑/沮丧。 无论效率如何,这只是一个概念性开销。 如果在文档中指出python模块的游标与SQL和数据库中的游标有点不同,那将会很好。

您需要一个游标对象来获取结果。 你的例子工作,因为它是一个INSERT ,因此你不试图从它得到任何行,但如果你看看sqlite3文档 ,你会发现连接对象上没有任何.fetchXXXX方法,所以如果你试图做一个没有光标的SELECT ,你将无法获得结果数据。

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

为了增加答案,Python文档说connection.execute()是创build中间游标对象的非标准快捷方式

http://docs.python.org/library/sqlite3.html#sqlite3.Connection.execute

[当前]文档说:

使用Connection对象的非标准execute(),executemany()和executecript()方法,可以更简洁地编写代码,因为您不必显式创build(往往是多余的)Cursor对象。 相反,游标对象是隐式创build的,这些快捷方法返回游标对象。 这样,您可以执行一个SELECT语句并直接使用Connection对象上的一个调用来遍历它。

我的build议是import this和自己判断。