2017-04-10 11 views
0

プライマリキーとオートインクリメントでテーブルを作成します。Python - 自動インクリメントのプライマリキー値を持たないSqliteタプルを挿入

最初にオートインクリメントされるので、合計列数が1よりも少ないタプルを挿入します。

sql_data = tuple(b) 
    c.executemany('insert into race values(?,?,?,?,?,?,?)', b) 

このエラーをどのようにして停止できますか? SQLite documentationから

sqlite3.OperationalError: table race has 8 columns but 7 values were supplied 

答えて

3

列で特定の順序を取ることは非常に悪い習慣です。 DBAの中には、テーブルを修正してSQL文を改めるものがあります。第2に、自動インクリメント値は、INSERTステートメントでフィールドの値を指定しない場合にのみ使用されます。値を指定すると、その値は新しい行に格納されます。

あなたはすべてが期待どおりに動作することを見つける必要があり

c.executemany('''insert into 
      race(R_number, R_KEY, R_NAME, R_AGE, R_DIST, R_CLASS, M_ID) 
      values(?,?,?,?,?,?,?)''', 
      sql_data) 

を読むためにコードを修正した場合。

+0

プライマリキーフィールドにNULLを格納しようとすると(NULLが有効なプライマリキーではないため)、一部のデータベースが自動インクリメント値を生成すると思われるため、少し誤っているかもしれません。 – holdenweb

+0

はい、それでもエラーです。 "python xml_race.py の値"(?、?、?、?、?、?、?) '' '、sql_dataの "xml_race.py"ファイルの78行目のトレースバック sqlite3.ProgrammingError:指定された数のバインディングが正しくありません。現在のステートメントは7を使用し、6が提供されます。 – sayth

+0

にnullを追加しようとしました。そのエラーメッセージの意味は 'len(sql_data)!= 7'です - 確認するには' print'を使って確認できますか? – holdenweb

1

If the column-name list after table-name is omitted then the number of values inserted into each row must be the same as the number of columns in the table.

RaceIDは表の列なので、あなたが列を明示的に命名することなく、INSERTをやっている時に存在すると予想されます。あなたは、PythonでNoneあり、その列にSQLiteのNULL値を渡すことによって(RaceID次オートインクリメント値を割り当てる)は、所望の動作を得ることができる:

sql_data = tuple((None,) + a for a in b) 
c.executemany('insert into race values(?,?,?,?,?,?,?,?)', sql_data) 

上記bをとるためのパラメータの配列の配列でありますexecutemanyステートメントを実行し、各サブシーケンスの先頭にNoneを追加しようとします。必要に応じてコードを変更します。

関連する問題