python 2.7中的sqlite3:将DB值与CSV值进行比较

时间:2017-02-27 03:03:39

标签: python python-2.7 csv sqlite

我有这个代码,它为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]对于我的数据库中的第一个项目表是唯一的,而行[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下不同表中的相同列名是否会导致问题,但无论如何我都不会 - 我只是改变了它是为了便于阅读。

编辑:

我还尝试检查每个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]])

然后只需插入列表' DB的值。没有好处

2 个答案:

答案 0 :(得分: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]))

答案 1 :(得分:0)

我想出来了......我正在比较item [0]和item [1]这些字符串是unicode的元组,即使我认为python能够执行此检查。

我将if子句改为

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