
如果你厌倦了复杂且依赖庞大的数据库迁移工具,渴望一个轻量级、零配置且功能强大的解决方案,那么 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 get github.com/gookit/miglite # 导入使用 import "github.com/gookit/miglite" miglite create my-table-up # status miglite status miglite up miglite status 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)。
# 创建一个新的迁移文件 miglite create add-users-table 这将在 ./migrations/ 目录下创建一个格式为 YYYYMMDD-HHMMSS-{migration-name}.sql 的文件,例如:
./migrations/20251105-102325-add-users-table.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; # 初始化迁移表(首次使用必须执行) 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/pq 或 github.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 | golang-migrate | goose | dbmate |
|---|---|---|---|---|
| 依赖复杂度 | 极简 | 中等 | 中等 | 简单 |
| 配置方式 | 零配置/文件配置 | 文件配置 | 文件配置 | 环境变量 |
| 迁移方式 | 原生 SQL | 多种支持 | 原生 SQL/Go | 原生 SQL |
| 事务支持 | 是 | 是 | 是 | 是 |
| 学习曲线 | 平缓 | 陡峭 | 平缓 | 平缓 |
| 库集成 | 优秀 | 优秀 | 一般 | 否 |
核心优势:miglite 在保持功能完整的同时,实现了极致的简洁性和易用性,非常适合追求开发效率和代码质量的团队。
miglite 是一个开源项目,我们欢迎任何形式的贡献:
请访问 GitHub 项目主页 获取更多信息或参与贡献。