TORM Go语言的优雅ORM库
go get -u github.com/zhoudm1743/torm
GitHub stars
GitHub forks
贡献者
为什么选择TORM
零配置启动
一行代码完成数据库连接和表创建,无需复杂配置
丰富TORM标签
30+种标签覆盖所有数据库特性,精确控制表结构
智能自动迁移
自动检测模型变更,安全更新表结构,保护现有数据
跨数据库兼容
MySQL、PostgreSQL、SQLite无缝切换,一套代码多环境
强大查询构建器
参数化查询、数组参数、自动占位符适配
自动事务管理
简洁的事务API,自动提交回滚,确保数据一致性
高性能优化
零反射查询、连接池优化、批量操作原生支持
生产就绪
完整测试覆盖、详细文档、丰富示例
快速上手
package main
import (
"time"
"github.com/zhoudm1743/torm"
)
// 用户模型
type User struct {
torm.BaseModel
ID int `json:"id" torm:"primary_key,auto_increment"`
Username string `json:"username" torm:"type:varchar,size:50,unique"`
Email string `json:"email" torm:"type:varchar,size:100,unique"`
Age int `json:"age" torm:"type:int,default:0"`
Status string `json:"status" torm:"type:varchar,size:20,default:active"`
CreatedAt time.Time `json:"created_at" torm:"auto_create_time"`
UpdatedAt time.Time `json:"updated_at" torm:"auto_update_time"`
}
func main() {
// 🚀 TORM
// 第1步:配置数据库(支持MySQL、PostgreSQL、SQLite)
torm.AddConnection("default", &torm.Config{
Driver: "mysql",
Host: "localhost",
Port: 3306,
Database: "myapp",
Username: "root",
Password: "password",
})
// 第2步:创建表结构
user := &User{}
user.AutoMigrate()
// 第3步:开始使用
// 创建用户
newUser := &User{
Username: "zhangsan",
Email: "zhangsan@example.com",
Age: 25,
Status: "active",
}
newUser.Save()
// 查询用户
users, _ := torm.Table("users").
Where("status", "=", "active").
Where("age", ">=", 18).
Get()
// 完成!无需复杂配置,立即可用
fmt.Printf("创建了 %d 个用户", len(users))
}
// 🏷️ TORM标签系统 - 30+种标签精确控制表结构
type Product struct {
torm.BaseModel
// 主键和自增
ID int64 `torm:"primary_key,auto_increment,comment:产品ID"`
// 字符串类型和长度控制
Name string `torm:"type:varchar,size:200,comment:产品名称"`
SKU string `torm:"type:varchar,size:50,unique,comment:产品编码"`
Category string `torm:"type:varchar,size:20,default:normal,index"`
// 数值类型和精度控制
Price float64 `torm:"type:decimal,precision:10,scale:2,comment:价格"`
Stock int `torm:"type:int,unsigned,default:0,comment:库存"`
Weight float64 `torm:"type:decimal,precision:8,scale:3,comment:重量"`
// 布尔和默认值
IsActive bool `torm:"type:boolean,default:1,comment:是否启用"`
IsNew bool `torm:"type:boolean,default:0,comment:是否新品"`
// 文本类型
Description string `torm:"type:text,comment:产品描述"`
Features string `torm:"type:longtext,comment:产品特性"`
// 二进制和JSON类型
Image []byte `torm:"type:blob,comment:产品图片"`
Settings map[string]interface{} `torm:"type:json,comment:设置信息"`
Tags []string `torm:"type:json,comment:标签列表"`
// 索引类型
SearchKey string `torm:"type:varchar,size:200,fulltext,comment:搜索关键词"`
Location string `torm:"type:varchar,size:100,spatial,comment:地理位置"`
// 外键和关联
CategoryID int `torm:"type:int,references:categories.id,on_delete:cascade"`
BrandID int `torm:"type:int,references:brands.id,on_delete:set_null"`
// 自动时间戳
CreatedAt time.Time `torm:"auto_create_time,comment:创建时间"`
UpdatedAt time.Time `torm:"auto_update_time,comment:更新时间"`
}
// 一行代码创建复杂表结构
func main() {
// 自动创建表、索引、外键、约束
product := &Product{}
product.AutoMigrate()
// 生成的MySQL DDL示例:
// CREATE TABLE products (
// id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '产品ID',
// name VARCHAR(200) COMMENT '产品名称',
// sku VARCHAR(50) UNIQUE COMMENT '产品编码',
// price DECIMAL(10,2) COMMENT '价格',
// stock INT UNSIGNED DEFAULT 0 COMMENT '库存',
// is_active BOOLEAN DEFAULT 1 COMMENT '是否启用',
// settings JSON COMMENT '设置信息',
// created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
// ...
// INDEX idx_category (category),
// FULLTEXT idx_search_key (search_key),
// FOREIGN KEY (category_id) REFERENCES categories(id) ON DELETE CASCADE
// );
}
// 自动迁移
// 第一次运行:创建基础表结构
type User struct {
torm.BaseModel
ID int `torm:"primary_key,auto_increment"`
Name string `torm:"type:varchar,size:50"`
}
func firstDeploy() {
user := &User{}
user.AutoMigrate()
// SQL: CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50))
}
// 第二次运行:添加新字段
type User struct {
torm.BaseModel
ID int `torm:"primary_key,auto_increment"`
Name string `torm:"type:varchar,size:50"`
Email string `torm:"type:varchar,size:100,unique"` // 新增字段
Age int `torm:"type:int,default:0"` // 新增字段
}
func secondDeploy() {
user := &User{}
user.AutoMigrate()
// 智能检测差异,只执行必要的变更:
// SQL: ALTER TABLE users ADD COLUMN email VARCHAR(100) UNIQUE
// SQL: ALTER TABLE users ADD COLUMN age INT DEFAULT 0
}
// 第三次运行:修改字段属性
type User struct {
torm.BaseModel
ID int `torm:"primary_key,auto_increment"`
Name string `torm:"type:varchar,size:100"` // 长度从50改为100
Email string `torm:"type:varchar,size:100,unique"`
Age int `torm:"type:int,default:0"`
}
func thirdDeploy() {
user := &User{}
user.AutoMigrate()
// 智能检测字段变更:
// SQL: ALTER TABLE users MODIFY COLUMN name VARCHAR(100)
}
// 跨数据库自动适配
func crossDatabase() {
// 同一模型定义,自动适配不同数据库
user := &User{}
// MySQL环境
user.SetConnection("mysql")
user.AutoMigrate() // 生成MySQL优化的DDL
// PostgreSQL环境
user.SetConnection("postgres")
user.AutoMigrate() // 生成PostgreSQL优化的DDL
// SQLite环境
user.SetConnection("sqlite")
user.AutoMigrate() // 生成SQLite兼容的DDL
}
// 🔗 查询构建器
func main() {
// 基础查询 - 链式调用
users, _ := torm.Table("users").
Where("status", "=", "active").
Where("age", ">=", 18).
OrderBy("created_at", "desc").
Limit(10).
Get()
// 参数化查询
user, _ := torm.Table("users").
Where("username = ? AND age >= ?", "zhangsan", 25).
First()
// 数组参数支持
activeUsers, _ := torm.Table("users").
Where("status IN (?)", []string{"active", "premium", "vip"}).
Where("age BETWEEN ? AND ?", 18, 65).
Get()
// 复杂条件组合
complexResults, _ := torm.Table("users").
Where("(status = ? OR vip_level > ?) AND age >= ?", "premium", 3, 25).
WhereIn("department", []string{"tech", "product", "design"}).
Get()
// 聚合和分页
count, _ := torm.Table("users").Where("status", "=", "active").Count()
pagination, _ := torm.Table("users").
Where("status", "=", "active").
Paginate(1, 20) // 第1页,每页20条
// 事务处理 - 自动管理
err := torm.Transaction(func(tx torm.TransactionInterface) error {
// 在事务中执行多个操作
_, err := tx.Exec("INSERT INTO orders (user_id, amount) VALUES (?, ?)",
123, 99.99)
if err != nil {
return err // 自动回滚
}
_, err = tx.Exec("UPDATE users SET balance = balance - ? WHERE id = ?",
99.99, 123)
if err != nil {
return err // 自动回滚
}
return nil // 自动提交
})
// 跨数据库占位符自动适配
// MySQL: SELECT * FROM users WHERE status = ? AND age >= ?
// PostgreSQL: SELECT * FROM users WHERE status = $1 AND age >= $2
// SQLite: SELECT * FROM users WHERE status = ? AND age >= ?
}
感谢我们的赞助商
白金赞助商
成为赞助商
黄金赞助商
成为赞助商
成为赞助商
成为赞助商