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)
}
性能提示
- 尽量复用DB实例而不是频繁创建和关闭
- 对于批量操作,使用InsertBatch而不是循环Insert
- 复杂的查询考虑使用原生SQL而不是构建器
- 合理使用连接池配置
buildsqlx 提供了简洁而强大的API来构建PostgreSQL查询,同时保持了代码的可读性和安全性。它特别适合需要灵活构建查询但又不想直接写原生SQL的中小型项目。