3

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 はBook.IDすべての行で 0 を埋めています。

それを避けるために私にできることはありますか?

4

1 に答える 1