下面给你一套常用、可直接用的 XORM(Go ORM)示例代码,覆盖连接数据库、建表、CRUD、事务、条件查询等核心用法。
一、安装依赖
go get xorm.io/xorm
go get github.com/go-sql-driver/mysql
二、初始化数据库连接
package main
import (
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
"xorm.io/xorm"
)
var engine *xorm.Engine
func initDB() {
var err error
dsn := "user:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=true"
engine, err = xorm.NewEngine("mysql", dsn)
if err != nil {
log.Fatal(err)
}
// 显示 SQL(开发环境建议开启)
engine.ShowSQL(true)
// 测试连接
if err = engine.Ping(); err != nil {
log.Fatal(err)
}
}
func main() {
initDB()
fmt.Println("DB connected")
}
三、定义结构体(映射数据表)
type User struct {
Id int64 `xorm:"pk autoincr"`
Username string `xorm:"varchar(50) notnull unique"`
Email string `xorm:"varchar(100)"`
Age int
CreatedAt time.Time `xorm:"created"`
UpdatedAt time.Time `xorm:"updated"`
}
四、自动建表
err := engine.Sync2(new(User))
if err != nil {
log.Fatal(err)
}
五、CRUD 示例
1️⃣ 新增数据
user := &User{
Username: "ajie",
Email: "ajie@test.com",
Age: 25,
}
_, err := engine.Insert(user)
2️⃣ 查询一条
var user User
has, err := engine.Where("username = ?", "ajie").Get(&user)
if has {
fmt.Println(user)
}
3️⃣ 查询多条
var users []User
err := engine.Where("age > ?", 18).Limit(10).Find(&users)
4️⃣ 更新数据
_, err := engine.ID(1).Update(&User{Email: "new@test.com"})
5️⃣ 删除数据
_, err := engine.ID(1).Delete(&User{})
六、事务示例(非常重要)
session := engine.NewSession()
defer session.Close()
if err := session.Begin(); err != nil {
return
}
_, err := session.Insert(&User{Username: "u1"})
if err != nil {
session.Rollback()
return
}
_, err = session.Insert(&User{Username: "u2"})
if err != nil {
session.Rollback()
return
}
session.Commit()
七、常用高级用法
条件组合
engine.Where("age > ?", 18).
And("email like ?", "%@test.com").
Desc("id").
Find(&users)
只更新非空字段
engine.ID(1).Cols("email").Update(&user)
原生 SQL
engine.SQL("SELECT * FROM user WHERE age > ?", 20).Find(&users)
八、适合哪些项目?
- ✅ 中小型 Go 项目
- ✅ 管理系统 / 后台接口
- ✅ Spring Boot + MySQL 项目迁移到 Go(你之前做过类似)
如果你愿意,我可以帮你:
- 🔹 写 完整 MVC / REST API 示例
- 🔹 给你 XORM vs GORM 对比
- 🔹 结合 Gin + XORM 实战项目结构
你是打算用在 什么项目里?我可以直接按你的场景给代码。