TORM Go语言的优雅ORM库

go get -u github.com/zhoudm1743/torm
GitHub stars
🍴 GitHub forks
👥 贡献者

为什么选择TORM

零配置启动

一行代码完成数据库连接和表创建,无需复杂配置

🏷️

丰富TORM标签

30+种标签覆盖所有数据库特性,精确控制表结构

🔄

智能自动迁移

自动检测模型变更,安全更新表结构,保护现有数据

🌐

跨数据库兼容

MySQL、PostgreSQL、SQLite无缝切换,一套代码多环境

🔗

强大查询构建器

参数化查询、数组参数、自动占位符适配

💼

自动事务管理

简洁的事务API,自动提交回滚,确保数据一致性

🚀

高性能优化

零反射查询、连接池优化、批量操作原生支持

🎯

生产就绪

完整测试覆盖、详细文档、丰富示例

快速上手

package main

import (
    "fmt"
    "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,index"`
    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,
    }
    newUser.Save()
    
    // 查询用户
    users, _ := torm.Table("users").
        Where("status", "=", "active").
        Where("age", ">=", 18).
        OrderBy("created_at", "desc").
        Get()
    
    fmt.Printf("查询到 %d 个活跃用户\n", 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
}
// 🔗 查询构建器 & 事务处理

// 基础查询 - 链式调用
users, _ := torm.Table("users").
    Select("id", "username", "email").
    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"}).
    Get()

// 聚合查询
count, _ := torm.Table("users").Where("status", "=", "active").Count()
sum, _ := torm.Table("orders").Where("user_id", "=", 1).Sum("amount")

// 分页查询
result, _ := 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 // 自动提交
})

// 缓存查询 - 5分钟有效期
users, _ = torm.Table("users").
    Where("status", "=", "active").
    Cache(5 * time.Minute).
    Get()

感谢我们的赞助商