簡體   English   中英

python 2.7中的sqlite3:比較DB值和CSV值

[英]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()

但是,如果另一個項目在另一個表中,這不會失敗。

這來自SQLite中關於upsert的另一個問題。

您還應該能夠擴展每個查詢,以檢查該項目在另一個表中是否唯一:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM