私はこのコードを持っています。これは2番目の列のcsvファイルを読み込み、各行からリストを追加します。Pythonのsqlite3 2.7:DB値とCSV値の比較
with open(self.selected_file[0], 'rb') as csv_file:
itemids = []
csv_reader = csv.reader(csv_file, delimiter=',', quotechar="\"")
for row in csv_reader:
itemids.append([row[0], row[1]])
私は既に2つのテーブルを持っているデータベースを持っています。私はcsvファイル(文字列のペア)のすべての行をチェックしたいと思います。両方の文字列がそれぞれのテーブルに固有の場合(つまり、行[0]がデータベース内の最初のアイテムテーブルと一意であり、2番目のアイテムテーブルに固有の行[1])、それぞれのテーブルに値を追加します。私は、次のことを試してみました:
for item in itemids:
first_itemids = db_cursor.execute('''SELECT itemid FROM items_one''').fetchall()
second_itemds = db_cursor.execute('''SELECT itemid from items_two''').fetchall()
try:
if not item[0] in first_itemids and not item[1] in second_itemids:
db_cursor.execute('''INSERT INTO items_one(itemid) VALUES (?)''', (item[0],))
db_cursor.execute('''INSERT INTO items_two(itemid) VALUES (?)''', (item[1],))
db_conn.commit()
しかし、このチェックif not item[0] in first_itemids and not item[1] in second_itemids
は常にtrueに評価され、そうでないユニークなアイテムを複製が追加されています。私はまた、 if item[0] in first_itemids or item[1] in second_itemids: pass
の周りに他の方法を試してみましたが、それはまた、
注意を失敗しました。これらは、同じDBの下で、異なるテーブルで同じカラム名が問題を引き起こす可能性があれば、私は知らない、私の実際の変数名ではなく、とにかく鉱山はありません。私は読みやすさのために変更しました。
編集:
with open(self.selected_file[0], 'rb') as csv_file:
itemids = []
csv_reader = csv.reader(csv_file, delimiter=',', quotechar="\"")
first_itemids = db_cursor.execute('''SELECT itemid FROM items_one''').fetchall()
second_itemids = db_cursor.execute('''SELECT itemid from items_two''').fetchall()
for row in csv_reader:
if row[0] not in first_itemds and row[1] not in second_itemids:
itemids.append([row[0], row[1]])
そしてちょうどDBにリストの値を挿入します。
また、私はそうのように私のアイテムリストに追加する前に、各CSVの行をチェックしてみました。良いないとしても
に私のif節を変更し、CSVファイル内の各項目について、同じSELECTクエリを呼び出すようです。 forループの前にselectを実行することをお勧めします。 – swbandit
1つのテーブルにアイテムを置いても、別のテーブルにアイテムを置くことはできますか?これにより、重複エントリが発生する可能性があります。私はまた、値が本当に正確であることを確認します。空白があると、値が異なることがあります。 – swbandit
あなたは正しいです - 私は各項目について同じSELECTクエリを呼び出します。これにより、csvファイルに重複した項目があるかどうかを確認できます。 あなたの他の質問については、DBブラウザを使用してチェックします。コードを実行しようとすると、両方の項目があります。 –