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

1 回复

更多关于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接口来扩展功能。

该库的性能表现良好,在大多数场景下与手动扫描的性能差异可以忽略不计,同时显著提升了代码的可读性和可维护性。

回到顶部