私が構造体を持っているとしましょう:
type User struct {
Name string
Id int
Score int
}
そして、同じスキーマを持つデータベース テーブル。データベースの行を構造体に解析する最も簡単な方法は何ですか? 以下に回答を追加しましたが、それが最良の回答かどうかはわかりません。
Go パッケージのテストは、多くの場合、物事を行う方法についての手がかりを提供します。たとえばdatabase/sql/sql_test.go
、
func TestQuery(t *testing.T) {
/* . . . */
rows, err := db.Query("SELECT|people|age,name|")
if err != nil {
t.Fatalf("Query: %v", err)
}
type row struct {
age int
name string
}
got := []row{}
for rows.Next() {
var r row
err = rows.Scan(&r.age, &r.name)
if err != nil {
t.Fatalf("Scan: %v", err)
}
got = append(got, r)
}
/* . . . */
}
func TestQueryRow(t *testing.T) {
/* . . . */
var name string
var age int
var birthday time.Time
err := db.QueryRow("SELECT|people|age,name|age=?", 3).Scan(&age)
/* . . . */
}
あなたの質問では、行を構造に照会すると、次のようになります。
var row struct {
age int
name string
}
err = db.QueryRow("SELECT|people|age,name|age=?", 3).Scan(&row.age, &row.name)
それがあなたの解決策に似ていることは知っていますが、解決策を見つける方法を示すことが重要です.
これを行う 1 つの方法を次に示します。関数内ですべての構造体値を手動で割り当てるだけScan
です。
func getUser(name string) (*User, error) {
var u User
// this calls sql.Open, etc.
db := getConnection()
// note the below syntax only works for postgres
err := db.QueryRow("SELECT * FROM users WHERE name = $1", name).Scan(&u.Id, &u.Name, &u.Score)
if err != nil {
return &User{}, err
} else {
return &u, nil
}
}
rows, err := connection.Query("SELECT `id`, `username`, `email` FROM `users`")
if err != nil {
panic(err.Error())
}
for rows.Next() {
var user User
if err := rows.Scan(&user.Id, &user.Username, &user.Email); err != nil {
log.Println(err.Error())
}
users = append(users, user)
}