golang PostgreSQL数据库查询构建器插件库buildsqlx的使用

Golang PostgreSQL数据库查询构建器插件库buildsqlx的使用

buildsqlx是一个Go语言的数据库查询构建器库,专门为PostgreSQL设计,提供了简洁高效的API来构建和执行SQL查询。

安装

go get -u github.com/arthurkushman/buildsqlx

基本使用示例

package main

import (
    "database/sql"
    "github.com/arthurkushman/buildsqlx"
    _ "github.com/lib/pq"
)

// 定义数据库连接
var db = buildsqlx.NewDb(buildsqlx.NewConnection("postgres", "user=postgres dbname=postgres password=postgres sslmode=disable"))

// 定义数据结构
type Post struct {
    ID     int64
    Title  string
    Body   string
    Points *int64
}

func main() {
    // 查询示例
    var posts []Post
    err := db.Table("posts").
        Select("id", "title", "body", "points").
        Where("points", ">", 100).
        OrderBy("created_at", "DESC").
        Limit(10).
        EachToStruct(func(rows *sql.Rows) error {
            var p Post
            err := db.Next(rows, &p)
            if err != nil {
                return err
            }
            posts = append(posts, p)
            return nil
        })
    
    if err != nil {
        panic(err)
    }
}

查询构建功能

基本查询

// 选择特定列
q := db.Table("users").Select("name", "email")

// 添加条件
q.Where("age", ">", 18)
  .AndWhere("status", "=", "active")
  .OrWhere("is_admin", "=", true)

// 排序和分页
q.OrderBy("created_at", "DESC")
  .Limit(20)
  .Offset(10)

// 执行查询
var users []User
err := q.ScanStruct(&users)

连接查询

err := db.Table("users").
    Select("users.name", "posts.title").
    LeftJoin("posts", "users.id", "=", "posts.user_id").
    Where("users.points", ">", 1000).
    ScanStruct(&result)

聚合函数

count, err := db.Table("users").Where("age", ">", 18).Count()
avgPoints, err := db.Table("users").Avg("points")
maxPoints, err := db.Table("users").Max("points")

数据操作

插入数据

// 单条插入
newPost := Post{
    Title: "New Post",
    Body: "This is the content",
}

id, err := db.Table("posts").InsertGetId(newPost)

// 批量插入
posts := []Post{
    {Title: "Post 1", Body: "Content 1"},
    {Title: "Post 2", Body: "Content 2"},
}
err := db.Table("posts").InsertBatch(posts)

更新数据

rowsAffected, err := db.Table("posts").
    Where("id", "=", 123).
    Update(Post{
        Title: "Updated Title",
        Body: "Updated content",
    })

删除数据

rowsAffected, err := db.Table("posts").
    Where("id", "=", 123).
    Delete()

高级功能

事务处理

err := db.InTransaction(func() (interface{}, error) {
    // 在事务中执行多个操作
    _, err := db.Table("users").Where("id", "=", 1).Update(map[string]interface{}{
        "points": 100,
    })
    if err != nil {
        return nil, err
    }
    
    _, err = db.Table("logs").Insert(map[string]interface{}{
        "user_id": 1,
        "action": "update_points",
    })
    
    return nil, err
})

表结构操作

// 创建表
res, err := db.Schema("users", func(table *buildsqlx.Table) error {
    table.Increments("id")
    table.String("name", 128).NotNull()
    table.String("email", 255).Unique()
    table.Integer("age").Default(0)
    table.DateTime("created_at", true)
    return nil
})

// 修改表
res, err := db.Schema("users", func(table *buildsqlx.Table) error {
    table.String("bio", 512).Change()
    table.DropColumn("old_column")
    return nil
})

调试SQL

// 打印SQL但不执行
db.Table("users").Select("name").Where("id", "=", 1).Dump()

// 打印SQL并退出
db.Table("users").Select("name").Where("id", "=", 1).Dd()

实用功能

检查表是否存在

exists, err := db.HasTable("public", "users")

分块处理大数据

var totalPoints int64
err := db.Table("users").
    Select("points").
    Chunk(&User{}, 100, func(users []any) bool {
        for _, u := range users {
            user := u.(User)
            totalPoints += user.Points
        }
        return true // 继续处理下一块
    })

获取单列值

var names []string
res, err := db.Table("users").Pluck(&User{})
for _, v := range res {
    user := v.(User)
    names = append(names, user.Name)
}

buildsqlx提供了简洁直观的API来构建复杂的SQL查询,同时保持了高性能和灵活性。它特别适合需要与PostgreSQL数据库交互的Go应用程序。


更多关于golang PostgreSQL数据库查询构建器插件库buildsqlx的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang PostgreSQL数据库查询构建器插件库buildsqlx的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


buildsqlx - Go语言的PostgreSQL查询构建器

buildsqlx 是一个轻量级的Go语言PostgreSQL查询构建器库,它提供了流畅的API来构建和执行SQL查询,同时保持类型安全和防止SQL注入。

安装

go get github.com/arthurkushman/buildsqlx

基本用法

初始化连接

package main

import (
	"fmt"
	"log"
	
	"github.com/arthurkushman/buildsqlx"
)

func main() {
	db, err := buildsqlx.NewDb(
		buildsqlx.WithHost("localhost"),
		buildsqlx.WithPort(5432),
		buildsqlx.WithUser("postgres"),
		buildsqlx.WithPassword("password"),
		buildsqlx.WithDbName("testdb"),
		buildsqlx.WithSSLMode("disable"),
	)
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()
	
	// 使用db进行查询...
}

查询示例

1. 简单查询

// 查询所有用户
users, err := db.Table("users").Get()
if err != nil {
    log.Fatal(err)
}
fmt.Printf("Users: %+v\n", users)

// 带条件的查询
user, err := db.Table("users").Where("id", "=", 1).First()
if err != nil {
    log.Fatal(err)
}
fmt.Printf("User: %+v\n", user)

2. 复杂查询

// 多条件查询
users, err := db.Table("users").
    Where("age", ">", 18).
    Where("status", "=", "active").
    OrderBy("created_at", "DESC").
    Limit(10).
    Offset(0).
    Get()
if err != nil {
    log.Fatal(err)
}

3. 连接查询

// 内连接
results, err := db.Table("users").
    Select("users.name", "orders.amount").
    Join("orders", "users.id", "=", "orders.user_id").
    Where("users.status", "=", "active").
    Get()
if err != nil {
    log.Fatal(err)
}

4. 插入数据

// 插入单条记录
id, err := db.Table("users").Insert(map[string]interface{}{
    "name":  "John Doe",
    "email": "john@example.com",
    "age":   30,
})
if err != nil {
    log.Fatal(err)
}
fmt.Printf("Inserted ID: %d\n", id)

// 批量插入
ids, err := db.Table("users").InsertBatch([]map[string]interface{}{
    {
        "name":  "Alice",
        "email": "alice@example.com",
        "age":   25,
    },
    {
        "name":  "Bob",
        "email": "bob@example.com",
        "age":   28,
    },
})
if err != nil {
    log.Fatal(err)
}
fmt.Printf("Inserted IDs: %v\n", ids)

5. 更新数据

// 更新记录
affected, err := db.Table("users").
    Where("id", "=", 1).
    Update(map[string]interface{}{
        "name": "Updated Name",
        "age":  31,
    })
if err != nil {
    log.Fatal(err)
}
fmt.Printf("Affected rows: %d\n", affected)

6. 删除数据

// 删除记录
affected, err := db.Table("users").
    Where("id", "=", 1).
    Delete()
if err != nil {
    log.Fatal(err)
}
fmt.Printf("Affected rows: %d\n", affected)

事务处理

err := db.Transaction(func(tx *buildsqlx.DB) error {
    // 在事务中执行操作
    _, err := tx.Table("users").Insert(map[string]interface{}{
        "name":  "Transaction User",
        "email": "tx@example.com",
    })
    if err != nil {
        return err
    }
    
    _, err = tx.Table("orders").Insert(map[string]interface{}{
        "user_id": 123,
        "amount":  100.50,
    })
    
    return err
})

if err != nil {
    log.Fatal("Transaction failed:", err)
}

高级特性

原生SQL查询

// 执行原生SQL查询
rows, err := db.QueryRaw("SELECT * FROM users WHERE age > ?", 18)
if err != nil {
    log.Fatal(err)
}
defer rows.Close()

// 处理结果...

聚合函数

// 计数
count, err := db.Table("users").Count()
if err != nil {
    log.Fatal(err)
}

// 求和
total, err := db.Table("orders").Sum("amount")
if err != nil {
    log.Fatal(err)
}

// 平均值
avg, err := db.Table("orders").Avg("amount")
if err != nil {
    log.Fatal(err)
}

分组和Having

results, err := db.Table("orders").
    Select("user_id", "SUM(amount) as total").
    GroupBy("user_id").
    Having("SUM(amount)", ">", 1000).
    Get()
if err != nil {
    log.Fatal(err)
}

性能提示

  1. 尽量复用DB实例而不是频繁创建和关闭
  2. 对于批量操作,使用InsertBatch而不是循环Insert
  3. 复杂的查询考虑使用原生SQL而不是构建器
  4. 合理使用连接池配置

buildsqlx 提供了简洁而强大的API来构建PostgreSQL查询,同时保持了代码的可读性和安全性。它特别适合需要灵活构建查询但又不想直接写原生SQL的中小型项目。

回到顶部