如果你厌倦了复杂且依赖庞大的数据库迁移工具,渴望一个轻量级、零配置且功能强大的解决方案,那么 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 项目主页 获取更多信息或参与贡献。