我想使用 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)
}
但我仍在尋找更好的答案......
米琪卡哇伊
TA貢獻1998條經驗 獲得超6個贊
我的建議是給SELECT你列出作者和INSERT遺漏的名單。該解決方案很幼稚,但它有效且簡單。我不是最新的 SQLite 關系特性,但使用它們并不總是處理外鍵的最簡單方法......。
現在,如果你有一個大批量數據的過程中,做同樣的操作,但是通過合并你的書的作者開始,所以你只能有一個SELECT再一個INSERT的事情。
- 2 回答
- 0 關注
- 213 瀏覽
添加回答
舉報
0/150
提交
取消
