miglite: Go 极简高效的数据库迁移工具 - V2EX
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 1 天前 665 次点击

    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 项目主页 获取更多信息或参与贡献。

    keepfun
        1
    keepfun  
       11 小时 16 分钟前
    有时间尝试下 学习下
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3088 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 40ms UTC 12:20 PVG 20:20 LAX 04:20 JFK 07:20
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86