golang轻量级SQL构建DSL插件库sqlingo的使用

golang轻量级SQL构建DSL插件库sqlingo的使用

sqlingo logo

sqlingo 是一个Go语言中的SQL DSL(也称为SQL构建器或ORM)库。它能从数据库生成代码,让你以优雅的方式编写SQL查询。

特性

  • 从数据库自动生成DSL对象和模型结构体,无需手动保持同步
  • 支持SQL DML(SELECT/INSERT/UPDATE/DELETE)和一些高级SQL查询语法
  • 许多常见错误可以在编译时检测到
  • 可以在编辑器/IDE中使用特性,如自动补全字段和查询,或查找字段或表的用法
  • 支持上下文
  • 支持事务
  • 支持拦截器
  • 支持Golang的time.Time类型,也可以通过添加-timeAsString参数在生成模型时使用字符串类型

数据库支持状态

数据库 状态
MySQL 稳定
PostgreSQL 实验性支持
SQLite 实验性支持

教程

安装和使用sqlingo代码生成器

第一步是从数据库生成代码。为了生成代码,sqlingo要求你的表已经在数据库中创建。

$ go install github.com/lqs/sqlingo/sqlingo-gen-mysql@latest
$ mkdir -p generated/sqlingo
$ sqlingo-gen-mysql root:123456@/database_name >generated/sqlingo/database_name.dsl.go

编写应用程序

下面是一些简单和高级的sqlingo用法示例:

package main

import (
    "github.com/lqs/sqlingo"
    . "./generated/sqlingo"
)

func main() {
    db, err := sqlingo.Open("mysql", "root:123456@/database_name")
    if err != nil {
        panic(err)
    }

    // 一个简单的查询
    var customers []*CustomerModel
    db.SelectFrom(Customer).
        Where(Customer.Id.In(1, 2)).
    	OrderBy(Customer.Name.Desc()).
        FetchAll(&customers)

    // 从多个表查询
    var customerId int64
    var orderId int64
    err = db.Select(Customer.Id, Order.Id).
        From(Customer, Order).
        Where(Customer.Id.Equals(Order.CustomerId), Order.Id.Equals(1)).
        FetchFirst(&customerId, &orderId)
    
    // 子查询和计数
    count, err := db.SelectFrom(Order)
        Where(Order.CustomerId.In(db.Select(Customer.Id).
            From(Customer).
            Where(Customer.Name.Equals("Customer One")))).
    	Count()
        
    // 分组并自动转换为map
    var customerIdToOrderCount map[int64]int64
    err = db.Select(Order.CustomerId, f.Count(1)).
    	From(Order).
    	GroupBy(Order.CustomerId).
    	FetchAll(&customerIdToOrderCount)
    if err != nil {
    	println(err)
    }
    
    // 插入一些行
    customer1 := &CustomerModel{name: "Customer One"}
    customer2 := &CustomerModel{name: "Customer Two"}
    _, err = db.InsertInto(Customer).
        Models(customer1, customer2).
        Execute()
    
    // 使用on-duplicate-key-update插入
    _, err = db.InsertInto(Customer).
    	Fields(Customer.Id, Customer.Name).
    	Values(42, "Universe").
    	OnDuplicateKeyUpdate().
    	Set(Customer.Name, Customer.Name.Concat(" 2")).
    	Execute()
}

这个示例展示了sqlingo的主要功能,包括基本查询、多表查询、子查询、分组统计、数据插入等操作。sqlingo提供了类型安全的SQL构建方式,能帮助开发者更高效地编写数据库操作代码。


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

1 回复

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


Golang轻量级SQL构建DSL插件库sqlingo使用指南

sqlingo是一个轻量级的Go语言SQL构建DSL库,它提供了一种类型安全、流畅的API来构建SQL查询,而不需要直接编写SQL字符串。

主要特性

  • 类型安全的SQL构建
  • 流畅的API设计
  • 支持大多数常见SQL操作
  • 轻量级无依赖
  • 支持上下文传递

安装

go get github.com/lqs/sqlingo

基本用法

初始化

import (
	"database/sql"
	"github.com/lqs/sqlingo"
)

func main() {
	db, err := sql.Open("mysql", "user:password@/dbname")
	if err != nil {
		panic(err)
	}
	
	sqlDb := sqlingo.NewDatabase(db)
	defer sqlDb.Close()
}

查询示例

简单查询

// 构建SQL: SELECT * FROM users WHERE id = 1
rows, err := sqlDb.SelectFrom("users").Where("id = 1").FetchAll()

带参数的查询

// 构建SQL: SELECT * FROM users WHERE id = ? AND name = ?
rows, err := sqlDb.SelectFrom("users").
	Where("id = ?", 1).
	And("name = ?", "John").
	FetchAll()

复杂查询

// 构建SQL: SELECT u.name, o.total FROM users u JOIN orders o ON u.id = o.user_id WHERE u.status = ? ORDER BY o.total DESC LIMIT 10
rows, err := sqlDb.Select("u.name", "o.total").
	From("users u").
	Join("orders o").On("u.id = o.user_id").
	Where("u.status = ?", "active").
	OrderBy("o.total DESC").
	Limit(10).
	FetchAll()

插入数据

// 构建SQL: INSERT INTO users (name, age) VALUES (?, ?)
result, err := sqlDb.InsertInto("users").
	Fields("name", "age").
	Values("John", 30).
	Execute()

批量插入

// 构建SQL: INSERT INTO users (name, age) VALUES (?, ?), (?, ?)
result, err := sqlDb.InsertInto("users").
	Fields("name", "age").
	Values("John", 30).
	Values("Alice", 25).
	Execute()

更新数据

// 构建SQL: UPDATE users SET name = ?, age = ? WHERE id = ?
result, err := sqlDb.Update("users").
	Set("name", "John Doe").
	Set("age", 31).
	Where("id = ?", 1).
	Execute()

删除数据

// 构建SQL: DELETE FROM users WHERE id = ?
result, err := sqlDb.DeleteFrom("users").
	Where("id = ?", 1).
	Execute()

高级特性

事务支持

err := sqlDb.Transaction(func() error {
	// 在事务中执行操作
	_, err := sqlDb.InsertInto("orders").Fields("user_id", "amount").Values(1, 100).Execute()
	if err != nil {
		return err
	}
	
	_, err = sqlDb.Update("users").Set("balance = balance - ?", 100).Where("id = ?", 1).Execute()
	return err
})

模型映射

sqlingo支持将查询结果映射到结构体:

type User struct {
	ID   int    `db:"id"`
	Name string `db:"name"`
	Age  int    `db:"age"`
}

var users []User
err := sqlDb.SelectFrom("users").Where("age > ?", 18).FetchAll(&users)

条件构建

query := sqlDb.SelectFrom("users")
if filterByName != "" {
	query = query.Where("name LIKE ?", "%"+filterByName+"%")
}
if minAge > 0 {
	query = query.And("age >= ?", minAge)
}
rows, err := query.FetchAll()

原生SQL支持

rows, err := sqlDb.RawSQL("SELECT * FROM users WHERE id IN (?, ?, ?)", 1, 2, 3).FetchAll()

性能考虑

sqlingo是一个轻量级库,相比直接使用database/sql,它提供了更好的开发体验而几乎不增加性能开销:

  1. 所有SQL构建都是在内存中完成的字符串操作
  2. 最终执行的仍然是标准的database/sql查询
  3. 没有ORM的反射开销

与类似库的比较

  • 相比gorm:更轻量,不提供迁移、关联等ORM功能
  • 相比sqlx:提供更丰富的SQL构建能力
  • 相比squirrel:API设计更简洁

总结

sqlingo是一个非常适合需要灵活构建SQL但又不想使用全功能ORM的场景。它提供了:

  1. 类型安全的SQL构建
  2. 流畅的API设计
  3. 轻量级实现
  4. 与标准库的良好集成

对于中小型项目或需要精细控制SQL的场景,sqlingo是一个很好的选择。

回到顶部