我正在使用以下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
子句查询表以获取现有行。
另外,需要注意的是,如果其他任何东西可能正在编辑数据库,那么运行查询然后插入并不能保证唯一性。有可能另一个线程/进程可以在你的查询和插入之间插入有问题的值。