Golang数据库扫描库Scany:将数据快速映射到结构体的利器
Golang数据库扫描库Scany:将数据快速映射到结构体的利器 我创建了这个库:https://github.com/georgysavva/scany。
它允许开发者仅通过一次函数调用,就能将数据库中的复杂数据扫描到 Go 结构体和其他复合类型中,而无需处理行的迭代。
scany 不限于任何特定的数据库。它与 database/sql 集成,因此支持任何具有 database/sql 驱动程序的数据库。它也能与 pgx 库的原生接口协同工作。除了开箱即用的支持外,scany 可以轻松扩展以与几乎任何数据库库一起使用。
以下是它的使用方法:
package main
import (
"context"
"database/sql"
"github.com/georgysavva/scany/sqlscan"
)
type User struct {
ID string
Name string
Email string
Age int
}
func main() {
ctx := context.Background()
db, _ := sql.Open("postgres", "example-connection-url")
var users []*User
sqlscan.Select(ctx, db, &users, `SELECT id, name, email, age FROM users`)
// users 变量现在包含了所有行的数据。
}
该库功能丰富,文档完善且经过充分测试。
更多关于Golang数据库扫描库Scany:将数据快速映射到结构体的利器的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于Golang数据库扫描库Scany:将数据快速映射到结构体的利器的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Scany确实是一个优秀的数据库扫描工具,它极大地简化了Go语言中数据库查询结果到结构体的映射过程。通过使用反射和合理的默认配置,它能够自动处理字段映射、类型转换等繁琐操作,让开发者专注于业务逻辑。
以下是几个使用示例,展示了Scany在不同场景下的应用:
1. 单行查询到结构体:
var user User
err := sqlscan.Get(ctx, db, &user, `SELECT id, name, email, age FROM users WHERE id=$1`, userID)
if err != nil {
// 处理错误
}
2. 复杂嵌套结构扫描:
type UserProfile struct {
User
Settings map[string]interface{} `db:"settings_json"`
Posts []Post
}
type Post struct {
ID string `db:"post_id"`
Content string
}
var profile UserProfile
err := sqlscan.Get(ctx, db, &profile, `
SELECT
u.id, u.name, u.email, u.age,
u.settings as settings_json,
p.id as post_id, p.content
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
WHERE u.id=$1
`, userID)
3. 使用pgx原生接口:
import "github.com/georgysavva/scany/pgxscan"
conn, _ := pgx.Connect(ctx, "postgres://...")
var users []User
err := pgxscan.Select(ctx, conn, &users, `SELECT * FROM users WHERE age > $1`, 18)
4. 自定义列名映射:
type Product struct {
ProductID int `db:"id"`
ProductName string `db:"name"`
Price float64
}
var products []Product
// 自动将数据库列"id"映射到ProductID,"name"映射到ProductName
sqlscan.Select(ctx, db, &products, `SELECT id, name, price FROM products`)
5. 处理NULL值:
type Customer struct {
ID string
Name string
MiddleName sql.NullString
Age sql.NullInt64
}
var customer Customer
sqlscan.Get(ctx, db, &customer, `SELECT id, name, middle_name, age FROM customers WHERE id=$1`, "123")
Scany的智能映射机制能够处理蛇形命名到驼峰命名的自动转换,支持嵌套结构、切片、映射等复杂类型。对于需要自定义映射逻辑的场景,可以通过实现sqlscan.RowScanner接口来扩展功能。
该库的性能表现良好,在大多数场景下与手动扫描的性能差异可以忽略不计,同时显著提升了代码的可读性和可维护性。

