亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將 CSV 導入到兩個使用 Python 相互引用的不同 SQL 表中

如何將 CSV 導入到兩個使用 Python 相互引用的不同 SQL 表中

胡子哥哥 2022-10-18 17:31:55
客觀的我正在研究 CS50 Web 的項目 1,書籍(https://docs.cs50.net/ocw/web/projects/1/project1.html)。它要求我將 csv 導入一個或兩個表的數據庫中。CSV 看起來像:isbn, title, author, year0131320931, The Hobbit, J.R.R. Tolkien, 1937我選擇制作兩張表:書籍和作者。他們看起來像:CREATE TABLE books (book_id SERIAL PRIMARY KEY, isbn VARCHAR(13), title VARCHAR(26021), author references authors(author_id),  year INT);CREATE TABLE authors (author_id SERIAL PRIMARY KEY, name VARCHAR(255));我的目標是使用帶有 SQLAlchemy 的 Python 腳本將 CSV 導入這兩個表中。問題我的問題是以書籍中的外國 id 引用作者的方式導入 CSV。我當前的代碼是這樣的:def main():    f = open("books.csv")    reader = csv.reader(f)    for isbn, title, author, year in reader:        db.execute("INSERT INTO authors (name) VALUES(:author)",                   {"author": author})        db.execute("INSERT INTO books (isbn, title, year) VALUES(:isbn, :title, :year)", {                   "isbn": isbn,                   "title": title                   "year": year})    db.commit()結果是: book_id |    isbn    |         title         | author | year ---------+------------+-----------------------+--------+------       1 | 0380795272 | Krondor: The Betrayal |   *    | 1998       2 | 1416949658 | The Dark Is Rising    |        | 1973*Should be "1", the foreign key for Raymond E. Feist. author_id |       name       -----------+------------------         1 | Raymond E. Feist         2 | Susan Cooper我似乎不太想用一種同時導入它們的方法來生成作者中的外鍵。我想創建一個臨時表并使用 SELECT WHERE 查詢,但這似乎是一種逃避。我還在使用作者的第二個 INSERT 中嘗試了一個嵌套函數,但這似乎不起作用。我正在使用 PostgreSQL。
查看完整描述

1 回答

?
慕田峪4524236

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 是偶然的,因為它們是輸入的第一條記錄。


查看完整回答
反對 回復 2022-10-18
  • 1 回答
  • 0 關注
  • 126 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號