Go语言ORM包worm:构造查询条件的实用示例

宋时安
宋时安
发布时间:2026-10-16| 5人浏览过
原创

worm是一款便捷的Go语言ORM库,支持结构体映射、原生SQL及Builder模式。本文通过具体代码示例,详解如何利用其链式API构造各类数据库查询条件,包括基础过滤、动态条件判断、集合匹配及复杂嵌套表达式,助你在Go项目中高效完成数据检索。

准备条件:环境搭建与模型定义

在使用worm之前,需确保已安装依赖并建立数据库连接。worm支持MySQL、PostgreSQL、SQLite和SQL Server,本文以MySQL为例。

第1步:初始化连接与日志

首先导入必要的驱动与worm库,配置连接字符串并开启SQL日志,以便观察生成的查询语句。

  1. 安装依赖:执行 go get github.com/haming123/wego。
  2. 连接数据库:使用 sql.Open 初始化连接池,并验证连接状态。
  3. 开启日志:调用 worm.ShowSqlLog(true) 在控制台输出执行的SQL及耗时,方便调试。
package main
import (
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
    log "github.com/haming123/wego/dlog"
    "github.com/haming123/wego/worm"
)
func mysql_open(cnnstr string) (*sql.DB, error) {
    db, err := sql.Open("mysql", cnnstr)
    if err != nil { return nil, err }
    err = db.Ping()
    if err != nil { return nil, err }
    return db, nil
}
func main() {
    cnnstr := "user:passwd@tcp(127.0.0.1:3306)/dbname?charset=utf8&parseTime=True"
    db_cnn, err := mysql_open(cnnstr)
    if err != nil { log.Error(err); return }
    worm.InitMysql(db_cnn)
    worm.ShowSqlLog(true)
}

第2步:定义数据模型(Model)

将数据库表映射为Go结构体。worm使用 db tag进行字段映射,可配置自增、忽略更新等属性。

type User struct {
    Id      int64     `db:"id;autoincr"`
    Name    string    `db:"name"`
    Age     int64     `db:"age"`
    Passwd  string    `db:"passwd"`
    Created time.Time `db:"created;n_update"`
}
func (ent *User) TableName() string {
    return "user"
}

核心操作:构造常用查询条件

第3步:基础查询(ID与Where)

最简单的是通过主键获取单条记录。对于多条件查询,Where 函数接受SQL模板和参数值,自动处理占位符转义。

  • ID查询:直接返回单条结果。
  • Where查询:类似 Sprintf 写法,使用 ? 作为占位符(worm会自动适配不同数据库的占位符格式)。
  • 建议拆分条件:当条件较多时,推荐使用 .And() 链接,避免参数错位风险。
// ID查询示例
var user model.User
_, err := worm.Model(&user).ID(1).Get()
// SQL: select ... from user where id=1 limit 1
// Where多条件示例
var users []model.User
err := worm.Model(&model.User{}).
    Where("id>?", 1).
    And("age>?", 10).
    Find(&users)
// SQL: select ... from user where id > 1 and age > 10

Like模糊查询:

err := worm.Model(&model.User{}).
    Where("name like ?", "%demo%").
    Find(&users)

第4步:动态条件与集合操作

在实际业务中,查询参数往往是不确定的。worm提供了智能条件添加功能,简化了逻辑判断。

1. If动态判断

WhereIf、AndIf 等函数接收一个布尔值作为第一个参数。若为 true,则拼接该条件;否则忽略。这比手动写 if-else 更简洁。

func DemoWhereIf(name string) {
    var users []model.User
    // 仅当 name 不为空时才添加 name=? 条件
    err := worm.Model(&model.User{}).
        WhereIf(name != "", "name=?", name).
        Find(&users)
}

2. In / Not In 查询

支持传入多个变长参数或数组,自动生成 IN (...) 语句。

func DemoWhereIn() {
    var users []model.User
    arr_id := []int64{11, 12, 13, 14}
    // 使用数组方式
    err := worm.Model(&model.User{}).
        Where("").
        AndIn("id", arr_id).
        Find(&users)
}

第5步:复杂表达式与排序分页

对于需要括号优先级的逻辑(如 A AND (B OR C)),可使用 SQLW 构建子句并通过 AndExp 嵌入。

func DemoWhereExp() {
    var users []model.User
    // 构建内部子句:(name='demo1' or name='demo2')
    sqlw := worm.SQLW("name=?", "demo1").Or("name=?", "demo2")
    
    // 外层查询:age > 10 AND (子句)
    err := worm.Model(&model.User{}).
        Where("age>?", 10).
        AndExp(sqlw).
        Find(&users)
}

分页与排序:

func DemoQueryPage(plen int64, pcur int64) {
    var users []model.User
    err := worm.Model(&model.User{}).
        Where("age>?", 10).
        Limit(plen).
        Offset(plen * pcur).
        OrderBy("created desc").
        Find(&users)
}

总结

上述内容详细展示了Go语言ORM包worm在构造查询条件时的关键用法。从基础的Where过滤到高级的嵌套表达式,worm的链式API使得构建复杂的SQL查询变得直观且不易出错。以上就是Go语言ORM包worm构造查询条件的详细内容,更多关于Go语言ORM教程的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。