
Tại sao cần database migration tool trong Golang
Khi xây dựng ứng dụng production với Golang, việc quản lý thay đổi schema database là bài toán bắt buộc. Ba công cụ phổ biến nhất hiện nay là golang-migrate, sqlc và Atlas, mỗi cái giải quyết vấn đề ở góc độ khác nhau.
golang-migrate: Chuẩn de facto cho migration versioning
golang-migrate (thường gọi là migrate) là thư viện migration thuần túy, hỗ trợ up/down migrations với file SQL hoặc Go code. Ưu điểm lớn nhất là hệ sinh thái plugin đa dạng: PostgreSQL, MySQL, SQLite, CockroachDB, Spanner, Cassandra. CLI migrate cung cấp lệnh create, up, down, force, version. Migration files được đặt tên theo quy ước {version}_{name}.up.sql và {version}_{name}.down.sql. Trong CI/CD, migrate thường chạy trong container init trước khi deploy app.
sqlc: Tự động sinh type-safe Go code từ SQL
sqlc không phải migration tool mà là code generator. Bạn viết SQL thuần túy trong file .sql, sqlc phân tích và sinh Go code type-safe với struct, method query, transaction. Lợi ích: không cần ORM, SQL được review trực tiếp, hiệu suất tối ưu. sqlc kết hợp tốt với migrate: migrate lo schema changes, sqlc lo query code. Cấu hình sqlc.yaml chỉ định engine (postgresql, mysql), schema path, query path, output package.
Atlas: Declarative schema management thế hệ mới
Atlas tiếp cận theo hướng declarative: bạn khai báo desired state trong file HCL hoặc SQL schema, Atlas so sánh với actual state của database và tự động sinh migration plan. Hỗ trợ PostgreSQL, MySQL, MariaDB, SQLite, SQL Server, ClickHouse, Redshift. Tính năng nổi bật: atlas schema apply tự động tính diff, atlas migrate diff sinh file migration từ desired state. Atlas Cloud cung cấp schema registry, drift detection, linting rules. Phù hợp cho team muốn quản lý schema như infrastructure-as-code.

So sánh nhanh ba công cụ
| Tiêu chí | golang-migrate | sqlc | Atlas |
|---|---|---|---|
| Paradigm | Imperative (up/down) | Code generation | Declarative |
| Schema versioning | File-based versioning | Không quản lý version | Desired state diff |
| Type-safe queries | Không | Có (tự động sinh) | Có (qua atlas provider) |
| CI/CD integration | Dễ dàng (CLI đơn giản) | Generate step trong build | Apply step với approval gate |
| Learning curve | Thấp | Trung bình (cần hiểu SQL annotations) | Cao (HCL, declarative mindset) |
Kết hợp thực tế: migrate + sqlc workflow
Workflow phổ biến nhất hiện nay là kết hợp golang-migrate cho schema changes và sqlc cho query layer:
- Dev tạo migration file:
migrate create -ext sql -dir db/migration -seq add_users_table - Viết SQL trong file
.up.sqlvà.down.sql - Chạy
migrate upđể apply lên dev DB - Viết query trong
db/query/users.sqlvới annotation sqlc - Chạy
sqlc generateđể sinh Go code - Commit cả migration files và generated code
Workflow này cho phép review SQL trực tiếp, tránh vendor lock-in của ORM, và dễ dàng rollback khi cần.
Khi nào nên dùng Atlas
Atlas phù hợp khi team đã quen với Terraform/HCL, muốn quản lý schema như infrastructure, cần drift detection tự động, hoặc làm việc với nhiều môi trường (dev/staging/prod) phức tạp. Chi phí học tập cao hơn nhưng long-term mang lại khả năng quản lý schema nhất quán hơn.

Tài liệu tham khảo: golang-migrate trên GitHub, sqlc documentation, Atlas documentation.
