我有这个代码,它为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的值。没有好处
答案 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: