1 回答

TA貢獻1875條經驗 獲得超5個贊
解決方案
我能夠弄清楚。ON CONFLICT DO NOTHING在使authors.name列唯一后,我使用了 PostgreSQL 的子句。我認為在這個數據結構中不可避免的一個警告是同名作者。我也不確定如何包含由多位作者撰寫的書籍。
代碼
def main():
f = open("books.csv")
reader = csv.reader(f)
reader.__next__
for isbn, title, author, year in reader:
db.execute("INSERT INTO authors (name) VALUES(:author) ON CONFLICT (name) DO NOTHING",
{"author": author})
db.execute("INSERT INTO books (isbn, title, author, year) VALUES(:isbn, :title, (SELECT author_id FROM authors WHERE name = :author), :year)", {
"isbn": isbn,
"author": author,
"title": title,
"year": year})
db.commit()
輸出
author_id | name
-----------+------------------
38 | Raymond E. Feist
book_id | isbn | title | author | year
---------+------------+-----------------------+--------+------
38 | 0380795272 | Krondor: The Betrayal | 38 | 1998
注意:它們共享相同的 ID 是偶然的,因為它們是輸入的第一條記錄。
添加回答
舉報