V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
jxia
V2EX  ›  Go 编程语言

miglite: Go 极简高效的数据库迁移工具

  •  1
     
  •   jxia · 4 小时 21 分钟前 · 199 次点击

    miglite: 极简高效的数据库迁移工具

    如果你厌倦了复杂且依赖庞大的数据库迁移工具,渴望一个轻量级、零配置且功能强大的解决方案,那么 miglite 绝对值得一试。它用最纯粹的方式解决数据库 Schema 迁移问题,让开发者回归编码本身。


    ✨ 项目简介

    miglite 是一个用 Golang 实现的极简数据库 Schema 迁移工具,它秉持"做一件事并做好"的设计哲学,提供了核心迁移功能的同时,保持了极致的轻量和易用性。

    🎯 核心特性

    特性 描述 优势
    🪶 极简依赖 基于 database/sql 接口开发,默认不添加任何驱动依赖包 保持项目轻量,避免依赖冲突
    📝 原生 SQL 使用原始 SQL 文件作为迁移方式,无特定 DSL 学习成本 直接利用现有 SQL 技能,迁移逻辑透明可控
    🔒 事务保障 所有迁移操作均在事务中执行,确保数据一致性 出现问题可自动回滚,避免数据库处于不一致状态
    🔧 零配置支持 支持通过环境变量直接运行,自动加载 .env 和默认配置文件 快速启动,减少配置烦恼
    🗄️ 多数据库支持 支持 MySQL 、SQLite 、PostgreSQL 等主流数据库 一套工具,多个项目复用

    🛠️ 快速开始

    安装方式

    作为命令行工具使用

    # 通过 go 安装
    go install github.com/gookit/miglite/cmd/miglite@latest
    

    作为 Go 库集成

    # 添加依赖
    go get github.com/gookit/miglite
    
    # 导入使用
    import "github.com/gookit/miglite"
    

    基本使用流程

    miglite create my-table-up
    
    # status
    miglite status
    miglite up
    
    miglite status
    

    💻 实战演示

    1️⃣ 配置数据库连接

    miglite 提供了多种配置方式,从零配置到完整配置文件任你选择。

    🔧 配置方式一:使用 miglite.yaml 文件

    创建项目根目录下创建 miglite.yaml

    database:
      driver: sqlite  # 支持 mysql, postgresql, sqlite
      dsn: ./miglite.db  # 数据库连接字符串或文件路径
    migrations:
      path: ./migrations  # 迁移文件存放目录
    

    🔧 配置方式二:完全使用环境变量(零配置)

    # 设置迁移文件路径
    export MIGRATIONS_PATH="./migrations"
    
    # SQLite 示例
    export DATABASE_URL="sqlite://path/to/your.db"
    
    # MySQL 示例
    export DATABASE_URL="mysql://user:passwd@tcp(127.0.0.1:3306)/local_test?charset=utf8mb4&parseTime=True&loc=Local"
    
    # PostgreSQL 示例
    export DATABASE_URL="postgres://host=localhost port=5432 user=username password=password dbname=dbname sslmode=disable"
    

    ⚠️ 注意:MySQL 连接 URL 必须带上 tcp 协议标记,如 tcp(127.0.0.1:3306)

    2️⃣ 创建迁移文件

    # 创建一个新的迁移文件
    miglite create add-users-table
    

    这将在 ./migrations/ 目录下创建一个格式为 YYYYMMDD-HHMMSS-{migration-name}.sql 的文件,例如:

    ./migrations/20251105-102325-add-users-table.sql
    

    3️⃣ 编写迁移 SQL

    迁移文件使用简单的注释标记来区分 UP(应用)和 DOWN(回滚)操作:

    -- Migrate:UP
    -- 在这里添加迁移 SQL (创建表、添加字段等)
    CREATE TABLE users (
        id INT PRIMARY KEY AUTO_INCREMENT,
        username VARCHAR(255) NOT NULL,
        email VARCHAR(255) NOT NULL UNIQUE,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );
    
    -- Migrate:DOWN
    -- 在这里添加回滚 SQL (删除表、移除字段等)
    DROP TABLE IF EXISTS users;
    

    📋 更复杂的迁移示例(包含索引和初始数据)

    -- Migrate:UP
    -- 创建文章表
    CREATE TABLE posts (
        id INT PRIMARY KEY AUTO_INCREMENT,
        title VARCHAR(255) NOT NULL,
        content TEXT,
        user_id INT NOT NULL,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
    );
    
    -- 创建索引
    CREATE INDEX idx_posts_user_id ON posts(user_id);
    CREATE INDEX idx_posts_created_at ON posts(created_at);
    
    -- 插入初始数据
    INSERT INTO posts (title, content, user_id) VALUES 
        ('Welcome to miglite', 'This is a sample post.', 1),
        ('Getting Started', 'Learn how to use miglite effectively.', 1);
    
    -- Migrate:DOWN
    -- 回滚操作(按相反顺序执行)
    DROP INDEX IF EXISTS idx_posts_created_at;
    DROP INDEX IF EXISTS idx_posts_user_id;
    DROP TABLE IF EXISTS posts;
    

    4️⃣ 执行迁移

    # 初始化迁移表(首次使用必须执行)
    miglite init
    
    # 应用所有待处理的迁移
    miglite up
    
    # 无需确认,立即执行所有迁移
    miglite up --yes
    
    # 回滚最近的迁移
    miglite down
    
    # 回滚多个迁移(例如回滚最近 3 个)
    miglite down --number 3
    
    # 查看迁移状态
    miglite status
    

    🧩 作为库使用集成

    miglite 的强大之处在于它不仅可以作为 CLI 工具使用,还可以 无缝集成到你的 Go 项目中

    github.com/gookit/miglite 不依赖任何三方数据库驱动包,使用你项目中引入的数据库驱动

    package main
    
    import (
        "github.com/gookit/miglite"
        _ "github.com/go-sql-driver/mysql" // 导入数据库驱动
        "log"
    )
    
    func main() {
        // 创建 miglite 实例 - 配置文件可以不存在,会自动读取相关 ENV 变量使用
        m := miglite.New("miglite.yaml")
        
        // 初始化迁移表
        if err := m.Init(); err != nil {
            log.Fatal(err)
        }
    
        // 应用迁移
        if err := m.Up(); err != nil {
            log.Fatal(err)
        }
    
        // 查看迁移状态
        status, err := m.Status()
        if err != nil {
            log.Fatal(err)
        }
        log.Printf("Migration status: %+v", status)
    }
    

    🎨 自定义命令行工具

    你还可以基于 miglite 库构建自定义的迁移命令行工具 (这是默认自带的功能),只包含你需要的数据库驱动:

    package main
    
    import (
        "github.com/gookit/miglite"
        "github.com/gookit/miglite/pkg/command"
        _ "github.com/go-sql-driver/mysql" // 只导入需要的驱动
        // _ "github.com/lib/pq"           // PostgreSQL 驱动(可选)
        // _ "modernc.org/sqlite"          // SQLite 驱动(可选)
    )
    
    var Version = "0.1.0"
    
    func main() {
        // 创建 CLI 应用
        app := command.NewApp("my-migrator", Version, "Custom migration tool")
        
        // 运行应用
        app.Run()
    }
    

    🔥 高级特性与技巧

    🧪 支持的数据库驱动选择

    数据库 推荐驱动 特点
    MySQL github.com/go-sql-driver/mysql 纯 Go 实现,广泛使用
    PostgreSQL github.com/lib/pqgithub.com/jackc/pgx/v5 pgx 性能更好,lib/pq 更兼容
    SQLite modernc.org/sqlite CGO-free ,跨平台友好
    MSSQL github.com/microsoft/go-mssqldb 官方驱动,功能完整

    💡 提示:作为库使用时,你需要自己导入所需的数据库驱动

    🔧 环境变量自动加载

    miglite 会自动尝试加载项目目录下的 .env 文件,支持以下环境变量:

    # 数据库连接 URL
    DATABASE_URL="sqlite://./myapp.db"
    
    # 迁移文件目录
    MIGRATIONS_PATH="./db/migrations"
    
    # 其他配置...
    

    📊 迁移状态查看

    使用 miglite status 命令可以查看详细的迁移状态,包括:

    $ miglite status
    
    Migration Status:
    ================
    +----------------+---------+---------------------+
    | Migration      | Status  | Applied At          |
    +----------------+---------+---------------------+
    | 20251105-102325 | UP      | 2025-11-05 10:25:30 |
    | 20251106-091500 | UP      | 2025-11-06 09:20:15 |
    | 20251107-143000 | DOWN    | 2025-11-07 14:35:00 |
    +----------------+---------+---------------------+
    

    🌟 为什么选择 miglite ?

    与其他迁移工具相比,miglite 提供了独特的价值:

    特性 miglite golang-migrate goose dbmate
    依赖复杂度 极简 中等 中等 简单
    配置方式 零配置/文件配置 文件配置 文件配置 环境变量
    迁移方式 原生 SQL 多种支持 原生 SQL/Go 原生 SQL
    事务支持 ✅ 是 ✅ 是 ✅ 是 ✅ 是
    学习曲线 平缓 陡峭 平缓 平缓
    库集成 ✅ 优秀 ✅ 优秀 ✅ 一般 ❌ 否

    💡 核心优势:miglite 在保持功能完整的同时,实现了极致的简洁性和易用性,非常适合追求开发效率和代码质量的团队。

    🎓 使用场景

    1. 个人项目:快速搭建项目原型,无需学习复杂配置
    2. 团队项目:统一迁移规范,通过原生 SQL 保持迁移逻辑透明
    3. CI/CD 集成:零配置特性使其极易集成到自动化流程中

    🤝 贡献与反馈

    miglite 是一个开源项目,我们欢迎任何形式的贡献:

    • 🐛 报告 Bug
    • 💡 提出新特性建议
    • 📝 改进文档
    • 🔧 提交代码修复

    请访问 GitHub 项目主页 获取更多信息或参与贡献。

    目前尚无回复
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   1970 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 16:13 · PVG 00:13 · LAX 08:13 · JFK 11:13
    ♥ Do have faith in what you're doing.