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 >= ?
}

感谢我们的赞助商