[英]sqlite3 in python 2.7: Comparing DB values with CSV values
我有這段代碼,它讀取前兩個2列的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文件的每一行(是成對的字符串)。 如果兩個字符串對於各自的表都是唯一的(意味着row [0]對於我的數據庫中的第一個項目表是唯一的,而row [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
檢查if not item[0] in first_itemids and not item[1] in second_itemids
始終為true,因此將添加重復的if not item[0] in first_itemids and not item[1] in second_itemids
。 我還嘗試了另一種方法, 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]])
然后只需將列表的值插入數據庫即可。 也不好
您可以使用“ 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()
但是,如果另一個項目在另一個表中,這不會失敗。
您還應該能夠擴展每個查詢,以檢查該項目在另一個表中是否唯一:
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]))
我發現了這一點...我正在比較item [0]和item [1],它們是字符串與unicode元組,即使我認為python能夠執行此檢查。
我將if子句更改為
if not (item[0],) in first_itemids and not (item[1],) in second_itemids:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.