8

我们正在使用一个包含很多字段的用户结构,如下所示:

type user struct {
    ID       int    `json:"id,omitempty"`
    UUID     string `json:"uuid,omitempty"`
    Role     int    `json:"role,omitempty"`
    Name     string `json:"name,omitempty"`
    Surname  string `json:"surname,omitempty"`
    Phone    string `json:"phone,omitempty"`
    Email    string `json:"email,omitempty"`
    Street   string `json:"street,omitempty"`
    City     string `json:"city,omitempty"`
    Password string `json:"password,omitempty"`
}

以及通过电子邮件获取用户的功能:

func getUserByEmail(email string) (u user, err error) {
    row := db.Psql.QueryRow(
        context.Background(),
        "SELECT * FROM users WHERE email=$1",
        email)
    err = row.Scan(&u.ID, &u.UUID, &u.Role, &u.Name, &u.Surname, &u.Phone, &u.Email, &u.Street, &u.City, &u.Password)
    if err != nil {
        log.Fatal(err)
    }
    return
}

有没有办法直接扫描到一个结构而不是它的所有属性?理想情况下:

row.Scan(&u)
4

3 回答 3

15

还有另一个图书馆scany。它适用于pgx本机界面,database/sql也适用于:

package main

import (
    "context"

    "github.com/jackc/pgx/v4/pgxpool"

    "github.com/georgysavva/scany/pgxscan"
)

type User struct {
    ID    string
    Name  string
    Email string
    Age   int
}

func main() {
    ctx := context.Background()
    db, _ := pgxpool.Connect(ctx, "example-connection-url")

    var users []*User
    pgxscan.Select(ctx, db, &users, `SELECT id, name, email, age FROM users`)
    // users variable now contains data from all rows.
}

它经过了很好的测试和记录,并且比 sqlx 的概念少得多。

免责声明,我是这个库的作者。

于 2020-07-30T15:22:08.093 回答
3

不是普通database/sql的,而是有一个名为sqlx的扩展库,它建立在上面database/sql并添加了一些有用的扩展,例如将行解组为结构(包括嵌套)、切片和数组:

type Place struct {
    Country       string
    City          sql.NullString
    TelephoneCode int `db:"telcode"`
}

rows, err := db.Queryx("SELECT * FROM place")
for rows.Next() {
    var p Place
    err = rows.StructScan(&p)
}

请参阅文档并查找StructScan.

于 2020-05-10T03:11:41.453 回答
0

目前,pgx库中不支持直接扫描到结构。最好使用像go-pg这样的 ORM ,它为您提供了许多用于数据库查询和扫描的功能。

于 2020-05-10T07:44:42.170 回答