golang支持更好空值处理的SQL查询构建器插件库gosql的使用

GoSQL - Golang支持更好空值处理的SQL查询构建器插件库

GoSQL是一个带有便捷实用函数的SQL查询构建器库,特别适合需要处理空值的场景。

安装

go get github.com/twharmon/gosql

基本使用示例

下面是一个完整的GoSQL使用示例,展示了CRUD操作:

package main

import (
	"database/sql"
	"github.com/twharmon/gosql"
	_ "github.com/mattn/go-sqlite3"
)

// 定义用户结构体,包含主键
type User struct {
    ID       int    `idx:"primary"`  // 主键字段
    Email    string 
    IsActive bool
    // 支持空值的字段可以使用指针类型
    LastLogin *string  // 可以为nil的字符串
    Age       *int     // 可以为nil的整数
}

func main() {
    // 打开数据库并创建连接
    sqliteDB, _ := sql.Open("sqlite3", "my-db.sql")
    db := gosql.New(sqliteDB)
    
    // 创建表
    db.MustExec(`CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY,
        email TEXT,
        is_active BOOLEAN,
        last_login TEXT,
        age INTEGER
    )`)

    // 插入数据 - 包含空值
    lastLogin := "2023-01-01"
    db.Insert(&User{
        ID:        1,
        Email:    "gopher@example.com",
        IsActive: true,
        LastLogin: &lastLogin,  // 非空值
        Age:      nil,          // 空值
    })

    // 查询单个记录
    var user User
    db.Select("*").Where("id = ?", 1).Get(&user)
    
    // 更新记录 - 包含空值处理
    user.Email = "gosql@example.com"
    user.LastLogin = nil  // 设置为空值
    age := 30
    user.Age = &age       // 设置为非空值
    db.Update(&user)

    // 查询多个记录
    var users []User
    db.Select("*").Where("is_active = ?", true).All(&users)
    
    // 删除记录
    db.Delete(&user)
}

空值处理

GoSQL通过使用指针类型来优雅地处理数据库中的NULL值:

// 定义支持空值的结构体
type Product struct {
    ID          int     `idx:"primary"`
    Name        string
    Description *string  // 可以为NULL的描述
    Price       *float64 // 可以为NULL的价格
}

// 使用示例
func handleNullValues(db *gosql.DB) {
    // 插入包含NULL值的数据
    price := 19.99
    db.Insert(&Product{
        ID:   1,
        Name: "Sample Product",
        Description: nil,  // 设置为NULL
        Price: &price,    // 设置为非NULL
    })
    
    // 查询时自动处理NULL值
    var product Product
    db.Select("*").Where("id = ?", 1).Get(&product)
    
    if product.Description == nil {
        println("Description is NULL")
    } else {
        println("Description:", *product.Description)
    }
}

高级查询示例

GoSQL支持链式调用构建复杂查询:

// 复杂查询示例
func advancedQuery(db *gosql.DB) {
    var activeUsers []User
    
    // 构建查询: SELECT * FROM users WHERE is_active = ? AND (email LIKE ? OR age > ?) ORDER BY email LIMIT 10
    db.Select("*").
        Where("is_active = ?", true).
        WhereGroup(func(q *gosql.Query) {
            q.Where("email LIKE ?", "%example%").
              OrWhere("age > ?", 18)
        }).
        OrderBy("email").
        Limit(10).
        All(&activeUsers)
        
    // 处理结果
    for _, user := range activeUsers {
        println(user.Email)
    }
}

性能基准

GoSQL的性能基准测试结果如下:

BenchmarkInsert-10            	    5637	    209484 ns/op	     448 B/op	      23 allocs/op
BenchmarkUpdate-10            	   90866	     12887 ns/op	     576 B/op	      27 allocs/op
BenchmarkSelect-10            	   90318	     13125 ns/op	     768 B/op	      41 allocs/op
BenchmarkSelectMany-10        	   12435	     96761 ns/op	   10640 B/op	     838 allocs/op
BenchmarkSelectManyPtrs-10    	   10000	    100512 ns/op	   11248 B/op	     938 allocs/op

GoSQL提供了简单易用的API来处理SQL操作,特别是对空值的处理非常友好,适合需要处理复杂数据模型的Golang应用。


更多关于golang支持更好空值处理的SQL查询构建器插件库gosql的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang支持更好空值处理的SQL查询构建器插件库gosql的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang SQL查询构建器gosql的使用指南

gosql是一个专注于更好空值处理的Golang SQL查询构建器库,它提供了简洁的API和强大的空值处理能力。下面我将详细介绍gosql的主要功能和使用方法。

安装gosql

go get github.com/ilibs/gosql

基本使用方法

初始化连接

import (
    "github.com/ilibs/gosql"
    _ "github.com/go-sql-driver/mysql"
)

func init() {
    configs := make(map[string]*gosql.Config)
    
    configs["default"] = &gosql.Config{
        Enable:  true,
        Driver:  "mysql",
        Dsn:     "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8",
        ShowSql: true,
    }
    
    gosql.Connect(configs)
}

基本查询

// 查询单条记录
var user struct {
    Id       int    `db:"id"`
    Name     string `db:"name"`
    Age      int    `db:"age"`
    NullName gosql.NullString `db:"null_name"`
}

err := gosql.QueryRow(&user, "select * from users where id = ?", 1)
if err != nil {
    log.Fatal(err)
}
fmt.Println(user)

// 查询多条记录
var users []struct {
    Id   int    `db:"id"`
    Name string `db:"name"`
}

err := gosql.Query(&users, "select * from users where age > ?", 18)
if err != nil {
    log.Fatal(err)
}
fmt.Println(users)

空值处理

gosql提供了专门的Null类型来处理数据库中的NULL值:

  • gosql.NullString
  • gosql.NullInt64
  • gosql.NullFloat64
  • gosql.NullBool
  • gosql.NullTime
type User struct {
    Id        int             `db:"id"`
    Name      string          `db:"name"`
    Age       gosql.NullInt64 `db:"age"`
    CreatedAt gosql.NullTime  `db:"created_at"`
}

var user User
err := gosql.QueryRow(&user, "select * from users where id = ?", 1)
if err != nil {
    log.Fatal(err)
}

// 检查是否有值
if user.Age.Valid {
    fmt.Println("Age:", user.Age.Int64)
} else {
    fmt.Println("Age is NULL")
}

查询构建器

gosql提供了流畅的查询构建API:

// 简单查询
rows, err := gosql.Queryx("users").Where("id > ?", 1).Limit(10).Get()

// 复杂查询
query := gosql.Queryx("users u").
    Select("u.id, u.name, p.title as post_title").
    Join("posts p", "p.user_id = u.id").
    Where("u.age > ?", 18).
    Where("p.status = ?", 1).
    OrderBy("u.id desc").
    Limit(10).
    Offset(0)

var results []map[string]interface{}
err := query.Get(&results)

事务处理

tx, err := gosql.Begin()
if err != nil {
    log.Fatal(err)
}

defer func() {
    if err != nil {
        tx.Rollback()
    } else {
        tx.Commit()
    }
}()

_, err = tx.Exec("update users set name = ? where id = ?", "newname", 1)
if err != nil {
    return err
}

_, err = tx.Exec("update profiles set avatar = ? where user_id = ?", "newavatar", 1)
if err != nil {
    return err
}

return nil

插入和更新

// 插入数据
user := map[string]interface{}{
    "name": "John",
    "age":  30,
    "null_name": gosql.NullString{String: "", Valid: false}, // 显式设置为NULL
}

id, err := gosql.Table("users").Insert(user)
if err != nil {
    log.Fatal(err)
}

// 更新数据
data := map[string]interface{}{
    "name": "John Doe",
    "age":  gosql.NullInt64{Int64: 0, Valid: false}, // 设置为NULL
}

_, err = gosql.Table("users").Where("id = ?", id).Update(data)
if err != nil {
    log.Fatal(err)
}

高级功能

批量插入

users := []map[string]interface{}{
    {"name": "user1", "age": 20},
    {"name": "user2", "age": 21},
    {"name": "user3", "age": gosql.NullInt64{Valid: false}}, // age为NULL
}

_, err := gosql.Table("users").BatchInsert(users)
if err != nil {
    log.Fatal(err)
}

使用结构体

type User struct {
    Id       int             `db:"id,primary"` // 主键
    Name     string          `db:"name"`
    Age      gosql.NullInt64 `db:"age"`
    NullName gosql.NullString `db:"null_name"`
}

// 插入
user := &User{
    Name: "John",
    Age:  gosql.NullInt64{Int64: 30, Valid: true},
    NullName: gosql.NullString{Valid: false},
}

id, err := gosql.Model(user).Insert()
if err != nil {
    log.Fatal(err)
}

// 更新
user.Name = "John Doe"
user.Age.Valid = false // 设置为NULL
_, err = gosql.Model(user).Update()
if err != nil {
    log.Fatal(err)
}

gosql通过提供专门的Null类型和简洁的API,使得Golang中的SQL操作和空值处理变得更加简单和安全。它的查询构建器功能强大但又不失灵活性,是处理数据库操作的优秀选择。

回到顶部