如何编写python程序将csv数据文件导入到关系数据库中,而不插入重复条目



我正在使用以下python代码将CSV数据文件导入到关系数据库中。

然而,我的代码插入重复的行(唯一的主键ID)在所有字典表。我如何更新我的代码,以摆脱欺骗。

import csv
from cs50 import SQL
open ("shows.db", "w").close()
db = SQL("sqlite:///shows.db")
db.execute("CREATE TABLE shows        (id      INTEGER,      title    TEXT,       PRIMARY KEY(id) )")
db.execute("CREATE TABLE genres       (id      INTEGER,      genre    TEXT,       PRIMARY KEY(id) )")
db.execute("CREATE TABLE shows_genres (show_id INTEGER,      genre_id INTEGER,    FOREIGN KEY(show_id) REFERENCES shows(id),   FOREIGN KEY(genre_id) REFERENCES genres(id) )")
with open("Favorite TV Shows - Form Responses 1.csv", "r") as file:
reader = csv.DictReader(file)
for row in reader:
titles = row["title"].strip().upper()
show_id = db.execute("INSERT INTO shows (title) VALUES (?)", titles)
for genre in row["genres"].split(", "):
genre_id = db.execute("INSERT OR IGNORE INTO genres (genre) VALUES (?)", genre)
db.execute("INSERT INTO shows_genres (show_id, genre_id) VALUES(?, ?)", show_id, genre_id)

原始数据-最喜欢的电影投票:

<表类>日期时间显示类型tbody><<tr>10/1/2021 9:00:00办公室喜剧10/1/2021 9:03:00边缘科幻10/1/2021 9:08:00办公室喜剧10/1/2021 9:10:00权力的游戏动作,奇幻

您可以在适当的列上使用UNIQUE约束创建表(UNIQUE约束教程)。这可以防止插入重复项。

请注意,当您尝试插入一个副本时,它将返回一个错误。您只需要捕获这个错误,这样它就不会使程序崩溃。
在本例中,如果您需要ID,那么您可以简单地使用WHERE子句查询表以获取现有行。

另外,需要注意的是,如果其他任何东西可能正在编辑数据库,那么运行查询然后插入并不能保证唯一性。有可能另一个线程/进程可以在你的查询和插入之间插入有问题的值。