96

私が構造体を持っているとしましょう:

type User struct {
    Name  string
    Id    int
    Score int
}

そして、同じスキーマを持つデータベース テーブル。データベースの行を構造体に解析する最も簡単な方法は何ですか? 以下に回答を追加しましたが、それが最良の回答かどうかはわかりません。

4

7 に答える 7

108

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)

それがあなたの解決策に似ていることは知っていますが、解決策を見つける方法を示すことが重要です.

于 2013-06-23T22:51:07.993 に答える
42

これを行う 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
    }
}
于 2013-06-23T21:22:58.497 に答える
7
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)
}

完全な例

于 2017-10-24T07:37:48.577 に答える
1

そのためのパッケージがあります:sqlstruct

残念ながら、前回チェックしたときは、組み込み構造体をサポートしていませんでした (自分で実装するのは簡単です - 数時間でプロトタイプが動作しました)。

sqlstructに加えた変更をコミットしました

于 2013-06-24T07:53:47.433 に答える