2012-06-10 25 views
3

我正在處理超過2900萬個元素,因此認爲數據庫比數組更有意義。將列表序列化爲SQLite

以前我一次只傳遞一個元素到execute函數,但我相信每次向executemany函數傳遞100,000個元素的數組會更有效。

我縮短了我的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. 

我在做什麼錯?

回答

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