golang轻松构建SQL查询的插件库builq的使用

golang轻松构建SQL查询的插件库builq的使用

简介

builq是一个用于在Go中轻松构建SQL查询的插件库。它提供了一种简单的方式来构建SQL查询并自动处理参数索引。

特点

  • 简单易用
  • 安全快速
  • 经过测试
  • 与语言无关
  • 无依赖

安装

Go版本要求1.19+

go get github.com/cristalhq/builq

使用示例

下面是一个完整的示例,展示如何使用builq构建SQL查询:

package main

import (
	"fmt"
	"github.com/cristalhq/builq"
)

func main() {
	// 定义要查询的列
	cols := builq.Columns{"foo, bar"}

	// 创建一个新的查询构建器
	q := builq.New()
	
	// 构建查询语句
	q("SELECT %s FROM %s", cols, "users")
	q("WHERE active IS TRUE")
	q("AND user_id = %$ OR user = %$", 42, "root")

	// 构建最终查询和参数
	query, args, err := q.Build()
	if err != nil {
		panic(err)
	}

	// 获取调试版本的查询(包含实际值)
	debug := q.DebugBuild()

	// 打印结果
	fmt.Println("query:")
	fmt.Println(query)
	fmt.Println("\nargs:")
	fmt.Println(args)
	fmt.Println("\ndebug:")
	fmt.Println(debug)

	// 输出:
	// query:
	// SELECT foo, bar FROM users
	// WHERE active IS TRUE
	// AND user_id = $1 OR user = $2
	//
	// args:
	// [42 root]
	//
	// debug:
	// SELECT foo, bar FROM 'users'
	// WHERE active IS TRUE
	// AND user_id = 42 OR user = 'root'
}

工作原理

  1. 使用builq.New()创建一个新的查询构建器
  2. 使用q()方法逐步构建查询,可以使用格式化占位符:
    • %s 用于安全插入列名或表名
    • %$ 用于参数占位符
  3. 最后调用Build()方法生成最终的SQL查询和参数列表
  4. 也可以使用DebugBuild()生成包含实际值的查询,便于调试

优势

  • 自动处理参数索引($1, $2等)
  • 防止SQL注入
  • 支持链式调用构建复杂查询
  • 提供调试模式方便开发

这个库非常适合需要动态构建SQL查询的场景,特别是当查询条件需要根据运行时条件动态变化时。


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

1 回复

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


使用builq轻松构建SQL查询

builq是一个Go语言的SQL查询构建器库,它提供了一种类型安全、灵活且易于使用的方式来构建SQL查询。下面我将介绍builq的主要功能和使用方法。

builq的主要特点

  1. 类型安全的SQL构建
  2. 支持多种SQL方言(MySQL, PostgreSQL, SQLite等)
  3. 防止SQL注入
  4. 链式调用API
  5. 支持复杂查询(JOIN, GROUP BY, HAVING等)

安装

go get github.com/cristalhq/builq

基本用法

简单查询

package main

import (
	"fmt"
	"github.com/cristalhq/builq"
)

func main() {
	q := builq.Select("id", "name", "email").
		From("users").
		Where("active = ?", true).
		OrderBy("name").
		Limit(10)

	sql, args, err := q.Build()
	if err != nil {
		panic(err)
	}

	fmt.Println(sql)    // SELECT id, name, email FROM users WHERE active = ? ORDER BY name LIMIT ?
	fmt.Println(args)  // [true 10]
}

插入数据

q := builq.InsertInto("users").
	Columns("name", "email", "age").
	Values("John", "john@example.com", 30).
	Values("Alice", "alice@example.com", 25)

sql, args, err := q.Build()
// INSERT INTO users (name, email, age) VALUES (?, ?, ?), (?, ?, ?)
// [John john@example.com 30 Alice alice@example.com 25]

更新数据

q := builq.Update("users").
	Set("name", "John Doe").
	Set("email", "johndoe@example.com").
	Where("id = ?", 123)

sql, args, err := q.Build()
// UPDATE users SET name = ?, email = ? WHERE id = ?
// [John Doe johndoe@example.com 123]

删除数据

q := builq.DeleteFrom("users").
	Where("id = ?", 123).
	And("active = ?", false)

sql, args, err := q.Build()
// DELETE FROM users WHERE id = ? AND active = ?
// [123 false]

高级用法

JOIN操作

q := builq.Select("u.id", "u.name", "p.title").
	From("users u").
	Join("posts p ON p.user_id = u.id").
	Where("u.active = ?", true)

sql, args, err := q.Build()
// SELECT u.id, u.name, p.title FROM users u JOIN posts p ON p.user_id = u.id WHERE u.active = ?
// [true]

子查询

subq := builq.Select("user_id").From("posts").Where("created_at > ?", "2023-01-01")

q := builq.Select("*").
	From("users").
	Where("id IN (?)", subq)

sql, args, err := q.Build()
// SELECT * FROM users WHERE id IN (SELECT user_id FROM posts WHERE created_at > ?)
// [2023-01-01]

批量插入

users := []struct {
	Name  string
	Email string
	Age   int
}{
	{"John", "john@example.com", 30},
	{"Alice", "alice@example.com", 25},
}

q := builq.InsertInto("users").Columns("name", "email", "age")
for _, user := range users {
	q.Values(user.Name, user.Email, user.Age)
}

sql, args, err := q.Build()
// INSERT INTO users (name, email, age) VALUES (?, ?, ?), (?, ?, ?)
// [John john@example.com 30 Alice alice@example.com 25]

与数据库交互

builq本身不处理数据库连接,但可以与标准库database/sql或其他ORM一起使用:

import "database/sql"

// 假设已经建立了db连接
var db *sql.DB

q := builq.Select("id", "name").From("users").Where("active = ?", true)
sql, args, _ := q.Build()

rows, err := db.Query(sql, args...)
if err != nil {
	panic(err)
}
defer rows.Close()

// 处理查询结果...

注意事项

  1. builq会自动处理参数化查询,防止SQL注入
  2. 复杂的SQL可能需要直接编写SQL语句
  3. 对于大量数据的批量操作,考虑使用专门的批量插入方法

builq是一个轻量级但功能强大的SQL构建器,适合需要灵活构建SQL查询但又不想使用全功能ORM的场景。它保持了代码的简洁性和可读性,同时提供了类型安全。

希望这个介绍能帮助你开始使用builq构建SQL查询!

回到顶部