2017-02-27 35 views
0

我有這段代碼,它讀取一個csv文件的第2列,並從每一行追加一個列表。python 2.7中的sqlite3:比較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]]) 

我有一個數據庫已經包含兩個表,分別爲每個項目。我希望檢查csv文件的每一行(它們是字符串對)。如果兩個字符串對它們各自的表都是唯一的(這意味着行[0]對於我的數據庫中的第一個項目表是唯一的,而對於我的第二個項目表,行[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 但也未能

注:這不是我的實際變量名,我不知道,如果在同一個數據庫在不同的表相同的列名可能會造成問題,但無論如何,地雷不是 - 我只是爲了可讀性而改變它。

編輯:

我也試過檢查每個CSV行追加到我的項目列表,像這樣前:

  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]]) 

然後只需插入列表值到數據庫。沒有一樣好

+0

看來你調用相同的SELECT查詢在csv文件的每個項目。我會建議在for循環之前進行選擇。 – swbandit

+0

有沒有可能你在一張桌子上有物品,但沒有另一張?這可能會導致重複的條目。我也會確保這些值確實是確切的。空格可以使值不同。 – swbandit

+0

你是對的 - 我確實爲每個項目調用相同的SELECT查詢。這樣你可以檢查csv文件中是否有重複的項目。 至於你的其他問題,我檢查使用數據庫瀏覽器 - 我試圖運行代碼時都有兩個項目。 –

回答

0

你可以使用一個「UPSERT」把獨特的物品在每個表:

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 ]哪些是unicode的元組的字符串,即使我認爲python能夠執行此檢查。

我改變了我的if語句來

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