gpt4 book ai didi

database - Go 语言,使用 sqlx.StructScan 扫描嵌入式结构

转载 作者:IT王子 更新时间:2023-10-29 01:59:04 41 4
gpt4 key购买 nike

<分区>

我刚开始学习 Go 语言。我编写了以下简单程序。

在这里,我试图用所有书籍和相关的作者来填充结构。

Book 结构已嵌入 Author 结构。

package main
import (
"fmt"
"log"
"time"
"github.com/jmoiron/sqlx"
_ "github.com/lib/pq"
)

type Book struct {
ID int
Title string
Year int
Bauther Auther `db:"auther"`
}

type Auther struct {
ID int
Name string
Dob time.Time
}

func main() {
db, err := sqlx.Open("postgres", "host=localhost user=testuser dbname=testdb password=testuser")
if err != nil {
log.Fatal("DB Conn error: ", err)
}

if err = db.Ping(); err != nil {
log.Fatal("DB Ping error: ", err)
}
defer db.Close()

rows, err := db.Queryx("Select b.*, a.name from books b left outer join authers a on a.ID=b.auther;")
if err != nil {
log.Fatal("DB Query error: ", err)
}
defer rows.Close()

var books []*Book
for rows.Next() {
var b = &Book{}
err := rows.StructScan(b)
if err != nil {
log.Fatal("Scan error: ", err)
}
books = append(books, b)
}

// print all books
for _, b := range books {
fmt.Printf("%v", b)
}
}

但是当我运行它时,它给出了以下错误

[samtech@sam sqlxapp]$ go run main.go
2016/02/11 18:45:46 Scan error: missing destination name name
exit status 1

我做错了什么?

我还尝试将 Book 结构中的字段标记更改为

Bauther  Auther `db:"auther,prefix=auth."`

并将查询更改为

rows, err := db.Queryx("Select b.*, auth.name from books b left outer join authers auth on auth.ID=b.auther;")

但它并没有做出任何改变。

编辑

经过几次尝试和错误,我终于让它工作了。

我必须稍微更改我创建的模型。我从

更改了 Book 结构
type Book struct {
ID int
Title string
Year int
Bauther Auther
}

type Book struct {
ID int // Key
Title string
Year int
AutherID int `db:"auther"` // FKey
Auther
}

现在,它工作正常。我犯的错误是,我将 Bauther 字段添加为 Auther。 sqlx无法理解。但是当我将 Auther 添加为匿名嵌入式结构时,问题就解决了。

但它引入了另一个问题:)

因为 ID 字段存在于 Book 以及 Auther 这两个结构中。现在 ScanStruct 在所有行中用 0 填充 Book.ID

有什么办法可以避免吗?

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com