如何使用 pgx 将 QueryRow 扫描到结构中
How to scan a QueryRow into a struct with pgx
我们正在使用一个包含大量字段的用户结构,如下所示:
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=",
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)
普通 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)
}
查看 documentation 并查找 StructScan
。
目前,pgx
库不支持直接扫描到结构。最好使用像 go-pg 这样的 ORM,它为您提供许多数据库查询和扫描功能。
还有一个图书馆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 的概念少得多。
免责声明,我是这个库的作者。
我们正在使用一个包含大量字段的用户结构,如下所示:
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=",
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)
普通 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)
}
查看 documentation 并查找 StructScan
。
目前,pgx
库不支持直接扫描到结构。最好使用像 go-pg 这样的 ORM,它为您提供许多数据库查询和扫描功能。
还有一个图书馆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 的概念少得多。
免责声明,我是这个库的作者。