我有這段代碼,它讀取一個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]])
然後只需插入列表值到數據庫。沒有一樣好
看來你調用相同的SELECT查詢在csv文件的每個項目。我會建議在for循環之前進行選擇。 – swbandit
有沒有可能你在一張桌子上有物品,但沒有另一張?這可能會導致重複的條目。我也會確保這些值確實是確切的。空格可以使值不同。 – swbandit
你是對的 - 我確實爲每個項目調用相同的SELECT查詢。這樣你可以檢查csv文件中是否有重複的項目。 至於你的其他問題,我檢查使用數據庫瀏覽器 - 我試圖運行代碼時都有兩個項目。 –