Go语言ORM包worm:构造查询条件的实用示例
worm是一款便捷的Go语言ORM库,支持结构体映射、原生SQL及Builder模式。本文通过具体代码示例,详解如何利用其链式API构造各类数据库查询条件,包括基础过滤、动态条件判断、集合匹配及复杂嵌套表达式,助你在Go项目中高效完成数据检索。
准备条件:环境搭建与模型定义
在使用worm之前,需确保已安装依赖并建立数据库连接。worm支持MySQL、PostgreSQL、SQLite和SQL Server,本文以MySQL为例。
第1步:初始化连接与日志
首先导入必要的驱动与worm库,配置连接字符串并开启SQL日志,以便观察生成的查询语句。
- 安装依赖:执行
go get github.com/haming123/wego。 - 连接数据库:使用
sql.Open初始化连接池,并验证连接状态。 - 开启日志:调用
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 > 10Like模糊查询:
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教程的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













