2017-02-27 21 views
0

私はこのコードを持っています。これは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の行をチェックしてみました。良いないとしても

+0

に私のif節を変更し、CSVファイル内の各項目について、同じSELECTクエリを呼び出すようです。 forループの前にselectを実行することをお勧めします。 – swbandit

+0

1つのテーブルにアイテムを置いても、別のテーブルにアイテムを置くことはできますか?これにより、重複エントリが発生する可能性があります。私はまた、値が本当に正確であることを確認します。空白があると、値が異なることがあります。 – swbandit

+0

あなたは正しいです - 私は各項目について同じSELECTクエリを呼び出します。これにより、csvファイルに重複した項目があるかどうかを確認できます。 あなたの他の質問については、DBブラウザを使用してチェックします。コードを実行しようとすると、両方の項目があります。 –

答えて

0

あなたが各テーブルにユニークなアイテムを置くために「アップサート」を使用することができませ:

for item in itemids: 
    db_cursor.execute('INSERT INTO items_one(itemid) VALUES (?) WHERE (SELECT changes()=0) AND NOT EXISTS (SELECT itemid FROM items_two WHERE itemid = ?)', (item[0], item[1])) 
    db_cursor.execute('INSERT INTO items_two(itemid) VALUES (?) WHERE (SELECT changes()=0)', (item[1],)) 
    db_conn.commit() 

しかし、他の項目は、他のテーブルにある場合、これは失敗しません。

これはupsert in SQLiteの別の質問から取られています。

あなたはまた、アイテムは、他のテーブルに一意であるかどうかを確認するために各クエリを拡張することができるはずです。

db_cursor.execute(''' 
    INSERT INTO items_one(itemid) 
    VALUES (?) 
    WHERE (SELECT changes()=0) 
     AND NOT EXISTS (
      SELECT itemid FROM items_two 
      WHERE itemid = ? 
     ) 
''', (item[0], item[1])) 
0

私はこれを考え出した...私はアイテムを比較して、[0]とアイテム[1 ]私はPythonはこのチェックを実行することができると思っていたにもかかわらず、ユニコードのタプルに文字列だった。

私は

if not (item[0],) in first_itemids and not (item[1],) in second_itemids: