惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Microsoft Security Blog
Microsoft Security Blog
Apple Machine Learning Research
Apple Machine Learning Research
美团技术团队
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
G
Google Developers Blog
阮一峰的网络日志
阮一峰的网络日志
The Cloudflare Blog
J
Java Code Geeks
Martin Fowler
Martin Fowler
M
MIT News - Artificial intelligence
IT之家
IT之家
博客园 - 三生石上(FineUI控件)
月光博客
月光博客
Google DeepMind News
Google DeepMind News
小众软件
小众软件
V
V2EX
Hugging Face - Blog
Hugging Face - Blog
爱范儿
爱范儿
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Jina AI
Jina AI
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
腾讯CDC
B
Blog

V2EX

我用 AI 写代码,但终端管理反而成了累赘——于是我做了 codux [调研] 各位在公司都用什么 ide 和 agent 写代码? 老运维 share 一个运维平台 新电脑 brew install node 之后,一个小设置可以提升对供应链投毒的防御 GLM-Coding 调用持续报错: z.ai 的 Lite 套餐几乎无法使用,官方 Pro/Max 是否稳定? 上海漕河泾内推,本组有 2 个 hc,一个后端,一个前端,预算都是 20k 左右,不打卡,氛围好 如果 V2EX 上有一组不永久保存聊天记录(比如只保存 7 天或者 24 小时)的聊天室,那么会开启哪些有用或者有趣的可能? gemini cli 貌似挂了,一直返回 403 第一次在自媒体上赚到钱 收集了最近在使用的低价 GPT, Gemini,邮箱等 AI 会员的小店合集 讨论个大实话:现在企业还在说 AI 编程提效 20%, 30%的,真的太落后,没用懂 AI。因为包括很多前沿公司,已经狂奔到提效 200%-500%的情况 [招聘][远程][币安] 前端/后端/QA/iOS/Android 至少 3 年以上经验 目前有大量 HC 欢迎投递 Chatgpt Pro 用量用不完的可以开这些设置 面试的时候好像遇到钓鱼了,给各位避个坑 cursor 年续费 22 号到期, 自动续费是否还是老的计次套餐呢 被两件破事毁掉的一下午,琐碎的内耗消磨人的精力 使用 Planet 存储 Codex 的会话或者重要信息 如果业务部门领导不要你开发功能,而是要求你教会它用 claude code 开发功能,你会怎么做? 分享一个 MacOS 接绿联 CM818 USB 转 DP 转接器使用感受 我的 HR 朋友 10 年老 Java ,非全大专,大家帮忙看看简历 开源了一个 AI 口语练习工具,音素级发音评分,完全免费可自部署 V2EX 上有哪些你觉得很有趣、印象深刻的妹纸? 字节为啥不出个国内版 Vercel? 有在大马的朋友吗? 问个运营商问题 你们在有领导的公司大群发过的最大胆的消息是什么 公司裁员,目前没有工作。想试试摆摊,做一个移动鲜啤打酒车 我的硬盘 Memblaze Pblaze 5 Linux 下不识别,给 Linux 内核提交了补丁, AI 说有望被合并 只有我一个人觉得 codex 不好用? 做了个 AI + 真人专家监督的广告投放平台 Auxora, 7 个品牌跑出 6x ROAS
miglite: Go 极简高效的数据库迁移工具
jxia · 2026-01-27 · via V2EX

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