我正在处理超过2900万个元素,因此认为数据库比数组更有意义。
以前我一次将一个元素传递给execute
函数,但我相信一次将一个包含100,000个元素的数组传递给executemany
函数会更有效。
我将我的180多行代码缩短为这个简短的测试用例:
import sqlite3
if __name__ == '__main__':
connection = sqlite3.connect('array.db')
cursor = connection.cursor()
cursor.execute("create table array (word text);")
cursor.executemany("insert into array values (?)", [u'usa', u'sharp', u'rise', u'seen', u'in', u'cd', u'bootlegs', u'sharp', u'rise', u'seen', u'in', u'cd', u'bootlegs', u'los', u'angeles'])
connection.commit()
cursor.execute("select * from array;")
print cursor.fetchall()
输出:
Traceback (most recent call last):
cursor.executemany("insert into array values (?)", [u'usa', u'sharp', u'rise', u'seen', u'in', u'cd', u'bootlegs', u'sharp', u'rise', u'seen', u'in', u'cd', u'bootlegs', u'los', u'angeles'])
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 3 supplied.
我做错了什么?
答案 0 :(得分:6)
使用.executemany()
时,您必须提供一系列元组(或列表)
所以你需要做的就是将每个单词包装成一个元组(或列表)
例如:
cursor.executemany("insert into array values (?)",
[(u'usa',), (u'sharp',), (u'rise',)])
(如果上面的内容不清楚,第二个参数现在是一个元素元组的列表。)
当您考虑.execute()
如何工作时,这种行为是有道理的,因为.execute()
还要求参数位于元组(或列表)中。
所以这不起作用:
cursor.execute("insert into array values (?)", some_word)
但这样做:
cursor.execute("insert into array values (?)", (some_word,))
答案 1 :(得分:1)
啊,他们需要有自己的元素:
import sqlite3
if __name__ == '__main__':
connection = sqlite3.connect('array.db')
cursor = connection.cursor()
cursor.execute("create table array (word text);")
cursor.executemany("insert into array values (?)", [[u'nabisco'],[u'usa'], [u'sharp'], [u'rise']])
connection.commit()
cursor.execute("select * from array;")
print cursor.fetchall()