如何编写python程序将csv数据文件导入关系数据库而不插入重复条目
Posted
技术标签:
【中文标题】如何编写python程序将csv数据文件导入关系数据库而不插入重复条目【英文标题】:How to write python program to import csv data file into a relational database without inserting duplicate entries 【发布时间】:2021-09-29 20:01:25 【问题描述】:我正在使用以下 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)
原始数据 - 最喜欢的电影投票:
Date Time | Show | Genre |
---|---|---|
10/1/2021 9:00:00 | The Office | Comedy |
10/1/2021 9:03:00 | Fringe | SciFi |
10/1/2021 9:08:00 | The Office | Comedy |
10/1/2021 9:10:00 | Games of Thrones | Action, Fantasy |
当前输出示例(有重复) - 流派字典表:
Genre_ID | Name |
---|---|
1 | Comedy |
2 | Sci-Fi |
3 | Comedy |
4 | Action |
5 | Fantasy |
所需的输出 - 显示字典表:
Show_ID | Title |
---|---|
1 | The Office |
2 | Fringe |
3 | GoT |
所需输出 - 流派字典表:
Genre_ID | Name |
---|---|
1 | Comedy |
2 | Sci-Fi |
3 | Action |
4 | Fantasy |
所需输出 - Shows_Genres 表:
Show_ID | Genre_ID |
---|---|
1 | 1 |
2 | 2 |
3 (GoT) | 3 (Action) |
3 (GoT) | 4 (Fantasy) |
【问题讨论】:
在写入之前查询该行的数据库以检查它是否已经存在。 请不要把所有东西都加粗,这真的伤了我的眼睛 【参考方案1】:您可以在适当的列 (UNIQUE constraint tutorial) 上使用 UNIQUE
约束来创建表。这样可以防止插入重复项。
请注意,当您尝试插入副本时,它会返回错误。您只需要捕获此错误,这样它就不会使您的程序崩溃。
在这种情况下,如果您需要 ID,则可以简单地使用 WHERE
子句查询表以获取现有行。
另外,重要的是要注意,如果有其他任何东西可能正在编辑数据库,那么运行查询然后您的插入将不能保证唯一性。另一个线程/进程可能会在您的查询和插入之间插入有问题的值。
【讨论】:
以上是关于如何编写python程序将csv数据文件导入关系数据库而不插入重复条目的主要内容,如果未能解决你的问题,请参考以下文章
如何将SalesForce数据导入Python Panda数据帧