Giới thiệu

Bạn đã bao giờ cảm thấy mệt mỏi với việc quản lý hàng chục, thậm chí hàng trăm file migration đánh số thứ tự như 001_init.sql, 002_add_email_to_users.sql chưa? Việc theo dõi trạng thái database giữa các môi trường dev, staging và production đôi khi trở thành một cơn ác mộng.

Đó là lúc sqldef xuất hiện như một vị cứu tinh. Đây là một công cụ quản lý schema theo phong cách idempotent (tính khả tuần). Thay vì viết các bước thay đổi (migration), bạn chỉ cần định nghĩa trạng thái cuối cùng mà bạn muốn database đạt được bằng mã SQL thuần túy. sqldef sẽ tự động so sánh và tạo ra các câu lệnh DDL cần thiết.

Với hơn 2,800 stars200 forks trên GitHub, project viết bằng Go này đang trở thành lựa chọn hàng đầu cho các nhà phát triển yêu thích sự đơn giản và hiệu quả.

Tính năng nổi bật

  • Sử dụng SQL thuần túy: Không cần học DSL (Domain Specific Language) phức tạp như Ruby hay YAML. Bạn chỉ cần biết SQL.
  • Tính khả tuần (Idempotent): Bạn có thể chạy công cụ nhiều lần mà không sợ gây lỗi; nó chỉ thực hiện thay đổi nếu trạng thái hiện tại khác với mong muốn.
  • Hỗ trợ đa cơ sở dữ liệu: Hoạt động mượt mà với MySQL, PostgreSQL, SQLite3 và SQL Server.
  • Chế độ Offline: So sánh hai file SQL với nhau mà không cần kết nối trực tiếp tới database.
  • Hỗ trợ đổi tên thông minh: Sử dụng annotation -- @renamed để xử lý việc đổi tên bảng hoặc cột mà không làm mất dữ liệu.

Cài đặt

sqldef được phân phối dưới dạng file thực thi duy nhất (single binary), cực kỳ gọn nhẹ.

Trên macOS (qua Homebrew):

```bash

Ví dụ cài đặt cho PostgreSQL

brew install sqldef/sqldef/psqldef

Ví dụ cài đặt cho MySQL

brew install sqldef/sqldef/mysqldef ```

Trên Linux:

Bạn có thể tải trực tiếp bản build từ GitHub Releases:

```bash wget -O - https://github.com/sqldef/sqldef/releases/latest/download/psqldef_linux_amd64.tar.gz | tar xvz ```

Hướng dẫn sử dụng

Giả sử bạn đang dùng PostgreSQL, công cụ tương ứng sẽ là `psqldef`.

1. Xuất Schema hiện tại

Đầu tiên, hãy lưu lại cấu trúc hiện tại của database:

```bash psqldef -u user -p password -h localhost db_name --export > schema.sql ```

2. Chỉnh sửa Schema

Mở file `schema.sql` và thêm một cột mới mà bạn muốn:

```sql CREATE TABLE users ( id BIGINT PRIMARY KEY, name VARCHAR(100), age INTEGER, -- Thêm cột này created_at TIMESTAMP ); ```

3. Xem trước thay đổi (Dry-run)

Trước khi áp dụng, hãy kiểm tra xem sqldef sẽ thực hiện những gì:

```bash psqldef -u user -p password -h localhost db_name --dry-run < schema.sql

Kết quả sẽ hiển thị: ALTER TABLE users ADD COLUMN age INTEGER;

```

4. Áp dụng thay đổi

Khi đã chắc chắn, hãy thực thi lệnh:

```bash psqldef -u user -p password -h localhost db_name --apply < schema.sql ```

Kết luận

Ưu điểm:

  • Cực kỳ đơn giản, không phụ thuộc vào framework hay ngôn ngữ lập trình cụ thể.
  • Giúp file schema luôn là "nguồn chân lý duy nhất" (Single Source of Truth).
  • Tích hợp CI/CD rất dễ dàng.

Nhược điểm:

  • Không phù hợp cho các ca migration dữ liệu phức tạp (ví dụ: gộp dữ liệu từ hai cột thành một).

sqldef là công cụ hoàn hảo cho các bạn DevOps hoặc Backend Developer muốn quản lý database schema một cách chuyên nghiệp, hiện đại mà không muốn sa lầy vào các hệ thống migration cồng kềnh. Hãy thử trải nghiệm và cảm nhận sự khác biệt nhé!


Nguồn: Tool: sqldef