3

我正在处理超过 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.

我究竟做错了什么?

4

2 回答 2

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,))
于 2012-06-10T18:30:15.903 回答
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()
于 2012-06-10T18:30:58.880 回答