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

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

SQLite、Golang 和連接表

SQLite、Golang 和連接表

Go
翻過高山走不出你 2021-12-13 18:31:10
我想使用 Go 和 sqlite 創建一個小型書籍數據庫。我從這個建議SQLite 外鍵示例中獲取主要內容并對其進行了一些重新開發。package main                                                                                                                                                import (    "database/sql"...    _ "github.com/mattn/go-sqlite3")...db, err := sql.Open("sqlite3", "./foo.db")if err != nil {    log.Fatal(err)}defer db.Close()sqlStmt := `    create table books (        id integer primary key autoincrement,         title text    );    create table booksauthors (         bookid integer references books(id),         uthorid integer references authors(id) ON DELETE CASCADE ON UPDATE CASCADE    );    create table authors (        id integer primary key autoincrement,         fname text,         mname text,        lname text,        unique (fname, mname, lname) on conflict ignore    );`因此,我想保留唯一作者的列表并與書籍表保持多對多連接(一本書可能有多個作者,而作者可能寫了多個書)。然后我簡單地循環添加書籍,獲取 LastIndexID 并將其放入連接表(代碼減少用于說明,b 是書籍結構):tx, err := db.Begin()if err != nil {    log.Fatal(err)}res, err := db.Exec("Insert into books(title) values(?)", b.Title)if err != nil {    log.Fatal(err)}b_id, _ := res.LastInsertId()for _, a := range b.Authors {    res, err = db.Exec("Insert into authors(fname, mname, lname) values(?, ?, ?)", a.Fname, a.Mname, a.Lname)    if err != nil {        log.Fatal(err)    }    a_id, _ := res.LastInsertId()    fmt.Println(a_id, b_id, a)    res, err = db.Exec("Insert into booksauthors(bookid, authorid) values(?, ?)", b_id, a_id)    if err != nil {        log.Fatal(err)    }}tx.Commit()
查看完整描述

2 回答

?
慕斯王

TA貢獻1864條經驗 獲得超2個贊

作為一個快速的'n'dirty hack,我在添加了一個作者后做了一個選擇:


err = db.QueryRow("select id from authors where fname = ? and mname = ? and lname = ?", a.Fname, a.Mname, a.Lname).Scan(&a_id)

if err != nil {

    log.Fatal(err)

}

res, err = db.Exec("Insert into booksauthors(bookid, authorid) values(?, ?)", b_id, a_id)

if err != nil {

    enter code herelog.Fatal(err)

}

但我仍在尋找更好的答案......


查看完整回答
反對 回復 2021-12-13
?
米琪卡哇伊

TA貢獻1998條經驗 獲得超6個贊

我的建議是給SELECT你列出作者和INSERT遺漏的名單。該解決方案很幼稚,但它有效且簡單。我不是最新的 SQLite 關系特性,但使用它們并不總是處理外鍵的最簡單方法......。

現在,如果你有一個大批量數據的過程中,做同樣的操作,但是通過合并你的書的作者開始,所以你只能有一個SELECT再一個INSERT的事情。


查看完整回答
反對 回復 2021-12-13
  • 2 回答
  • 0 關注
  • 213 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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