0

要素を保存したいタプルがあります。次のように挿入しようとしていますが、次のエラーが表示されます。何が間違っていますか? records_to_be_inserted は、8 つの要素を持つタプルです。

with self.connection:
        cur = self.connection.cursor()
        cur.executemany("INSERT INTO rehberim(names, phone, mobile, email, \
                        photo, address, note, date) VALUES(?, ?, ?, ?, ?, ?, ?, ?)", self.records_to_be_inserTed)

トレースバック (最新の呼び出しが最後): ファイル "/home/tayfun/workspace/personal_guide/modules/mainwindow.py"、57 行目、save_records の写真、住所、メモ、日付) VALUES(?, ?, ?, ?, ? , ?, ?, ?)", self.records_to_be_inserTed) sqlite3.ProgrammingError: 指定されたバインドの数が正しくありません。現在のステートメントでは 8 が使用されていますが、0 が指定されています。

4

2 に答える 2

3

executemanyは複数の行を挿入するためのものであることに注意してください。

import sqlite3

""" the table structure is:
create table tab
    a char(1),
    b char(2),
    c char(3)
)
"""

conn = sqlite3.connect('C:\\test.db')
stmt = "insert into tab (a, b, c) values (?, ?, ?)"

cur = conn.cursor()
## many rows
vals = [('1','2','3'), ('2','3','4'), ('3','4','5')]

cur.executemany(stmt, vals)
cur.close()

これにより、データベースに3つの行が作成されます。1つのクエリに複数の値があるためである場合は、フォーマットする必要があります。

編集:辞書付きのフォーマットを追加

format次のアプローチを使用すると、ディクショナリのキーが値を{key_word}プレースホルダーにマッピングするため、呼び出しの値の順序を考慮する必要がありません。

values = {'a' : 'value_a',
          'b' : 'value_b'}

stmt = "insert into tab (col_a, col_b) values ({a}, {b})".format(**values)
于 2011-11-08T14:14:17.910 に答える
2

クエリには、すべてのデータを挿入する準備ができている必要があります。クエリで関数を呼び出しています。これは、データを提供する必要があると思いますが、機能しません。すべてのデータを変数に渡すか、タプル インデックスに配置する必要があります (例: tuple_name[1]、tuple_name[4] など)。

例:

myTuple = ['a','b','c','d','e','f','g']
cur.executemany("INSERT INTO rehberim(names, phone, mobile, email, \
                    photo, address, note, date) VALUES({0}, {1}, {2}, {3}, {4}, {5}, {6}" .format (myTuple[1], myTuple[2], myTuple[3], myTuple[4], myTuple[5], myTuple[6], myTuple[7])
于 2011-11-08T13:58:26.677 に答える