如何编写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数据帧

如何将导入 python 的数据从 csv 文件转换为时间序列?

python如何导入数据

怎么把批处理文件导入python

从csv文件导入python时如何替换数字

将用户 .csv 文件中的数据导入表中