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

推荐订阅源

A
About on SuperTechFans
Cloudbric
Cloudbric
C
CERT Recently Published Vulnerability Notes
G
GRAHAM CLULEY
V
Vulnerabilities – Threatpost
C
Cisco Blogs
T
Tenable Blog
P
Privacy International News Feed
T
The Exploit Database - CXSecurity.com
I
Intezer
AWS News Blog
AWS News Blog
IT之家
IT之家
博客园 - 司徒正美
C
Cybersecurity and Infrastructure Security Agency CISA
博客园 - 【当耐特】
The Hacker News
The Hacker News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Spread Privacy
Spread Privacy
S
SegmentFault 最新的问题
博客园 - Franky
人人都是产品经理
人人都是产品经理
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
V
Visual Studio Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
H
Hacker News: Front Page
Latest news
Latest news
Scott Helme
Scott Helme
腾讯CDC
宝玉的分享
宝玉的分享
大猫的无限游戏
大猫的无限游戏
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
A
Arctic Wolf
S
Securelist
雷峰网
雷峰网
The GitHub Blog
The GitHub Blog
Project Zero
Project Zero
Google DeepMind News
Google DeepMind News
P
Palo Alto Networks Blog
F
Fortinet All Blogs
Schneier on Security
Schneier on Security
云风的 BLOG
云风的 BLOG
Security Archives - TechRepublic
Security Archives - TechRepublic
The Last Watchdog
The Last Watchdog
WordPress大学
WordPress大学
MongoDB | Blog
MongoDB | Blog
L
LINUX DO - 最新话题
S
Schneier on Security
NISL@THU
NISL@THU
Jina AI
Jina AI
M
MIT News - Artificial intelligence

Go 编程语言

构建时自动注入版本号:从 Git tag 到 Go 可执行文件 - V2EX [边缘计算] 想借助 AI 来开发 边缘网关接入 AI 解决设备通信 不知道有没有需求 - V2EX [Go]工业边缘计算网关 edgex 业余时间独立开发 持续更新半年咯 求个 star - V2EX eget:不用等中央仓库,直接安装 GitHub 和任意下载站的工具 - V2EX gookit/gcli v3.8:新增支持共享选项、文档生成和参数重排 - V2EX V2EX 我开源了一款极简的 P2P 文件传输与 VPN 工具 (Win/Mac/ Linux /Android) - V2EX gookit/gcli v3.5.0 发布 - 简单易用、功能丰富的 Go 命令行应用与工具库 - V2EX 用 Go gRPC 信令对接 Android WebRTC:大家一般怎么划分网关和客户端边界? 在服务端用 Pion + FFmpeg + RNN 做 WebRTC 通话降噪,值得吗? 这两种 lint 报错场景, v 友们一般怎么处理 - V2EX tikrok 的部分来时路 tikrok 第 7 代微服务重构: Golang 微服务 grpc 接口与服务实现隔离方案 写了个 Go 库:在 TCP 应用协议开始前做认证,也支持端口敲门 Tikrok v6.0 新的生产级架构,成本不变,但是部署复杂略有增加 go 打包的二进制程序怎么反编译 [边缘计算开源] 工业数据采集网关 版本更新 用 golang 写了,一套面向个人音乐资产的本地优先音乐系统 做了个 Go 的 MCP Server 框架,一行代码把 Gin API 接入 AI - V2EX 写了个 Go 库解决 LLM 流式输出断线重连的问题 - V2EX Tikrok v5.0 新的的底层实现 - V2EX OpenTelemetry 分布式追踪中的回溯采样:削减 60% 尾部采样成本 - V2EX 求推荐一个 go 里运行 js 的方案 - V2EX [边缘计算] 基于 GO 的采集网关持续更新啦 - V2EX [边缘计算开源] 基于 go 写了个独立运行的工业数据采集网关 后续阶段应该如何调整 - V2EX 然后 go-kratos 不怎么活跃了,连最火的 skills 都不搞, github 也没什么人回复了 - V2EX Excelize 开源基础库发布 2.10.1 版本更新 phper 转 go 最好的 web 框架是 goframe 吗? - V2EX A Visual Studio Code extension that displays the disk size of Go module dependencies in go.mod files. - V2EX 每秒万级 Tick 震荡:高频行情分发,该选 Golang 的并发原生还是 Rust 的极致性能? - V2EX 给 netcat 引入了 P2P 穿透、多路复用、强加密以及内置服务模块,并且完全开源 - V2EX 使用 "go.inlayHints.parameterNames": true 在 vscode 中开启类似 goland 的参数提示 - V2EX 下面代码中 f()会被重复执行吗?大佬帮忙解答一下~ - V2EX sublimetext 开发 GO 使用体验怎么样 - V2EX [开源] 将 react 的 hooks 和 组件化思路带入 go 的 TUI 开发。 - V2EX gocar 0.2.0 版本:新增自定义命令功能,实现真正的 go 的 cargo - V2EX go 新手,求问导入包失败问题 - V2EX 之前写的, JSR-310 风格的时间日期库, 1.0 了 - V2EX 为了方便学习 go, 使用 go 做了一个命令行版本的 go playground, 代码直接一键运行, 一键编译 - V2EX 虚心请教 Go 前辈们,关于入行 - V2EX 关于 Go 的工程经验 - V2EX 微信开发框架开源,基于 Go+Wails3+React - V2EX Golang 实现的开源 NVR 支持 GB28181 & ONVIF 啦 - V2EX Go 工具库 gookit/goutil v0.7.2 发布:增强功能与修复,提升开发体验 - V2EX go-carbon v2.6.15 正式版发布,已被 docker 官方组织使用 - V2EX 如何用 3–5 个高效问题快速识别 Golang 开发者的技术素养? - V2EX 有没有 go 的 ai 应用项目学习学习 - V2EX Go 环境版本管理用哪个- -有点疑惑 - V2EX Goland 下的通义千问不能选择模型,VScode 下面的通义千问可以选择模型 - V2EX 新手入门求指导 - V2EX 看 Go 的时间库不顺眼很久了,所以从别的语言里抄了一个 - V2EX go-dongle v1.2.0 发布,新增 SM2 非对称椭圆曲线加密算法支持 - V2EX Wails2+Vue3 本地的绑定文件和 Vite 上的不一致 - V2EX go 返回错误的时候, 返回的值应该可用吗 - V2EX Go 入门基础课(2025 Golang) - V2EX goland 中如何 debug wails - V2EX 日期函数获取上一个月 bug, 在一些特殊日子才出现,比如今天 10-31 - V2EX go-carbon v2.6.14 发布,一个轻量级、语义化的 golang 时间处理库 - V2EX goroutine 到底算不算一种 coroutine 的实现? - V2EX 为什么不用 gRPC-Go: VictoriaTraces 中实现 OTLP/gRPC 的幕后故事 - V2EX go 最新版的 map 并发读是安全的吗。 - V2EX 请问一下 golang 下有什么成熟稳定的串口通讯包? - V2EX golang.org/x/sync/syncmap 被 struct 裹挟时 使用前为什么必须为每个键初始化 不然取值得到 nil go-dongle v1.1.7 发布,新增 SM4 国密分组对称加密算法支持 在开发接口的过程中,如何快速验证结果? - V2EX go-carbon v2.6.13 发布,一个轻量级、语义化的 golang 时间处理库
miglite: Go 极简高效的数据库迁移工具 - V2EX
jxia · 2026-01-27 · via Go 编程语言

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