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 を埋めています。
それを避けるために私にできることはありますか?