2016-06-22 6 views
0

私が書いたpythonスクリプトを使用して、いくつかのcsvファイルからSQLite3データベースにデータを挿入しています。私は、スクリプトを実行すると、データベースへの最初の行を挿入しますが、2番目のはめ込みしようとすると、このエラーを与える:SQLite3のカラムがユニークでない

sqlite3.IntegrityError: columns column_name1, column_name2 are not unique. 

それは本当であるcolumn_name1とcolumn_name2の値がの最初の2行で同じですcsvファイルしかし、これは私にとってはちょっと変わったようです。なぜなら、このエラーについて読むと、データベースの列の1つ以上に一意性制約があることを示しているからです。私はSQLite Expert Personalを使ってデータベースの詳細をチェックしましたが、現在のテーブルには一意性の制約はありません。また、私が入力しているフィールドのどれもプライマリキーを指定しません。それはデータベースが自動的にそれらを割り当てるようです。何が原因でこのエラーが発生する可能性がありますか?ありがとう。

import sqlite3 
import csv 

if __name__ == '__main__' : 

conn = sqlite3.connect('ts_database.sqlite3') 
c = conn.cursor() 

fileName = "file_name.csv" 
f = open(fileName) 
csv_f = csv.reader(f) 

for row in csv_f: 
    command = "INSERT INTO table_name(column_name1, column_name2, column_name3)" 
    command += " VALUES (%s, '%s', %s);" % (row[0],row[1],row[2]) 
    print command 
    c.execute(command) 
    conn.commit() 

f.close() 
+0

この投稿はなぜ投票されましたか?私はそれが適切な研究背景を示し、問題の明確な説明をしたと思います。私は確かに自分のコードをコピー&ペーストして "これに何が問題なの?"と尋ねただけではありませんでした。 –

答えて

2

SQLiteがIntegrityErrorエラーを報告している場合、実際にはその2つの列にPRIMARY KEYまたはUNIQUE KEYがあり、そうでないと間違っている可能性が非常に高いです。データベースの同じインスタンスを実際に見ていることを確認してください。

また、ではなく、文字列補間を使用してSQL文を記述します。それは危険でもあり、正しいことを得ることも難しいです(おそらくあなたがフィールドの一重引用符を持っていると考えているように)。 SQLiteでパラメータ化された文を使用するのは非常に簡単です。

+0

ありがとうございます。私は使用しているSQLiteのGUIに精通していません。私はそれについて間違った結論に達した。 –

0

エラーは、INSERT INTOステートメントの列名が重複している可能性があります。私はそれがtypoであり、あなたがINSERT INTOステートメントのcolumn_name3を意味していたと推測しています。

+0

はい。実際には、私はプライバシーの理由から、実際のカラム名をこれらのカラム名に置き換えました。実際には、これらのラベルはユニークです。 –

+0

あいまいさを取り除くために私はそれを元に戻しました。 –

関連する問題