3

私は 2,900 万を超える要素を扱っているので、データベースは配列よりも理にかなっていると思いました。

以前は要素を一度に 1 つずつ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',)])

(上記が明確でない場合、2 番目の引数は 1 要素のタプルのリストになります。)


どのように機能するかを考えると、パラメーターがタプル (またはリスト) にある必要がある.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 に答える