1. Giới thiệu về Atlas

atlas

Atlas là một công cụ độc lập với ngôn ngữ được thiết kế đặc biệt để quản lý và di chuyển các lược đồ cơ sở dữ liệu bằng các nguyên tắc DevOps hiện đại. Nó cung cấp hai tùy chọn luồng làm việc:

  • Mô tả: Tương tự như Terraform, Atlas so sánh trạng thái hiện tại của cơ sở dữ liệu với trạng thái mong muốn được xác định bằng HCL, SQL, hoặc ORM schema. Dựa trên sự so sánh này, nó tạo và thực thi một kế hoạch di chuyển để chuyển đổi cơ sở dữ liệu đến trạng thái mong muốn.
  • Phiên bản hóa: Không giống như các công cụ khác, Atlas tự động lập kế hoạch cho việc di chuyển lược đồ. Người dùng có thể mô tả lược đồ cơ sở dữ liệu mong muốn của họ bằng HCL, SQL, hoặc ORM mà họ chọn, và với Atlas, lập kế hoạch, xem xét và áp dụng các di chuyển cần thiết đến cơ sở dữ liệu.

Một ưu điểm chính của Atlas là sự đơn giản hóa của sự phức tạp trong quản lý cơ sở dữ liệu, làm cho việc kiểm soát phiên bản, cộng tác và triển khai trở nên dễ dàng.

2. Cài đặt Atlas

Trước khi sử dụng Atlas để quản lý các phiên bản cơ sở dữ liệu, chúng ta cần cài đặt nó. Dưới đây là các bước cài đặt cho các nền tảng khác nhau.

2.1 Cài đặt trên macOS + Linux

Trên hệ thống macOS hoặc Linux, bạn có thể tải về và cài đặt phiên bản mới nhất của Atlas bằng dòng lệnh sau:

curl -sSf https://atlasgo.sh | sh

Dòng lệnh này sẽ tự động phát hiện phiên bản hệ điều hành, tải về phiên bản phù hợp và đặt tệp nhị phân của Atlas vào đường dẫn có thể thực thi.

2.2 Cài đặt qua Homebrew

Nếu bạn đang sử dụng macOS và đã cài đặt trình quản lý gói Homebrew, việc cài đặt Atlas rất đơn giản bằng cách chạy lệnh sau:

brew install ariga/tap/atlas

Điều này sẽ tải về phiên bản mới nhất của Atlas từ kho lưu trữ của Homebrew và cài đặt nó.

2.3 Cài đặt qua Docker

Việc cài đặt và chạy Atlas thông qua Docker là một phương pháp nhanh chóng và tiện lợi, đặc biệt là cho việc kiểm thử tạm thời hoặc cho người dùng không muốn cài đặt phần mềm bổ sung trên hệ thống máy chủ của họ.

Đầu tiên, kéo tệp Docker image của Atlas:

docker pull arigaio/atlas

Sau đó, bạn có thể chạy lệnh trợ giúp để xác nhận việc cài đặt thành công:

docker run --rm arigaio/atlas --help

Nếu container cần truy cập vào mạng máy chủ hoặc thư mục cục bộ, sử dụng cờ --net=host và mount các thư mục cần thiết:

docker run --rm --net=host \
  -v $(pwd)/migrations:/migrations \
  arigaio/atlas migrate apply \
  --url "mysql://root:pass@:3306/test"

2.4 Cài đặt trên Windows

Tải tệp nhị phân tại https://release.ariga.io/atlas/atlas-windows-amd64-latest.exe, và thêm đường dẫn cài đặt vào biến môi trường PATH của hệ thống.

3. Xuất Cấu Trúc Bảng Cơ Sở Dữ Liệu Hiện Có Bằng Atlas

Atlas cung cấp lệnh atlas schema inspect, có thể sử dụng để xuất cấu trúc của một cơ sở dữ liệu hiện có. Lệnh này hỗ trợ đọc mô tả cơ sở dữ liệu từ URL cơ sở dữ liệu và xuất chúng dưới ba định dạng khác nhau: định dạng mặc định Atlas HCL, định dạng SQL và định dạng JSON. Trong hướng dẫn này, chúng tôi sẽ chỉ cho cách sử dụng định dạng Atlas HCL và SQL, vì định dạng JSON thường được sử dụng để xử lý đầu ra với jq.

Để kiểm tra một thể hiện MySQL đang chạy cục bộ và ghi đầu ra vào một tệp có tên là schema.hcl, sử dụng lệnh sau:

atlas schema inspect -u "mysql://root:pass@localhost:3306/example" > schema.hcl

Mở tệp schema.hcl để xem định nghĩa cấu trúc bảng Atlas mô tả cơ sở dữ liệu (HCL là định dạng cấu trúc bảng độc lập với cơ sở dữ liệu được định nghĩa bởi Atlas). Ví dụ, tệp này sẽ chứa nội dung sau:

table "users" {
  schema = schema.example
  column "id" {
    null = false
    type = int
  }
  column "name" {
    null = true
    type = varchar(100)
  }
  primary_key {
    columns = [column.id]
  }
}

Khối mã này đại diện cho một cấu trúc bảng với các cột idname. Trường schema trỏ đến định nghĩa mô hình example được xác định ở nơi khác trong tài liệu này. Ngoài ra, khối con primary_key chỉ định cột id làm khóa chính cho bảng. Atlas cố gắng mô phỏng cú pháp của cơ sở dữ liệu đang được vận hành. Trong ví dụ này, cột id có kiểu int, trong khi cột name có kiểu varchar(100).

Tương tự, để xuất định nghĩa mô hình SQL của cơ sở dữ liệu, bạn có thể sử dụng lệnh sau:

atlas schema inspect -u "mysql://root:pass@localhost:3306/example" --format '{{ sql . }}' > schema.sql

Mở tệp schema.sql để xem mô tả SQL của cơ sở dữ liệu, thường chứa một số câu lệnh CREATE TABLE.

Phương pháp này giúp dễ dàng hiểu chi tiết về cấu trúc bảng cơ sở dữ liệu hiện có và cung cấp một tài liệu tham chiếu chính xác cho các phiên bản chuyển đổi sau này.

4.1 Quy Trình Mô Tả

Quy trình mô tả của Atlas cho phép người dùng mô tả một cách mô tả đích đến cuối cùng mong muốn của cơ sở dữ liệu. Người dùng chỉ cần mô tả những gì họ muốn trạng thái cuối cùng của schema cơ sở dữ liệu là, và công cụ Atlas sẽ tự động tạo và thực hiện kế hoạch di cư để an toàn chuyển đổi schema cơ sở dữ liệu từ trạng thái hiện tại sang trạng thái mong đợi này.

Dưới đây là cách sử dụng Quy trình Mô tả để xác định và đạt được trạng thái cơ sở dữ liệu mong muốn:

4.1.1 Định Nghĩa Cấu Trúc Bảng Mục Tiêu

Đầu tiên, bạn cần tạo một tệp định nghĩa cấu trúc cơ sở dữ liệu mong đợi, có thể ở định dạng HCL, SQL hoặc ORM (Object-Relational Mapping).

Lấy ví dụ định dạng HCL, định nghĩa một bảng mới blog_posts:

table "blog_posts" {
  schema = schema.example
  column "id" {
    null = false
    type = int
  }
  column "title" {
    null = true
    type = varchar(100)
  }
  column "body" {
    null = true
    type = text
  }
  column "author_id" {
    null = true
    type = int
  }
  primary_key {
    columns = [column.id]
  }
  foreign_key "author_fk" {
    columns     = [column.author_id]
    ref_columns = [table.users.column.id]
  }
}

Lưu ý: Định dạng cú pháp HCL sẽ được bàn luận trong phần sau.

4.1.2 Thực Hiện Di Cư Sử Dụng Công Cụ Atlas

Khi định nghĩa cấu trúc bảng cơ sở dữ liệu hoàn thành, bạn có thể sử dụng lệnh schema apply của Atlas để thực hiện di cư.

atlas schema apply \
  -u "mysql://root:pass@localhost:3306/example" \
  --to file://schema.hcl

Sau khi thực hiện lệnh trên, Atlas sẽ so sánh schema cơ sở dữ liệu hiện có với schema được xác định trong tệp, tạo kế hoạch di cư và yêu cầu người dùng xác nhận để thực hiện. Khi người dùng xác nhận kế hoạch thực hiện, Atlas sẽ thực hiện di cư trên cơ sở dữ liệu và cập nhật nó đến trạng thái mong muốn.

4.2 Quy Trình Phiên Bản Hóa

Quy trình phiên bản hóa là một chế độ sử dụng khác được hỗ trợ bởi Atlas, đôi khi được gọi là "di cư dựa trên thay đổi". Nó phù hợp cho các trường hợp mà các thay đổi schema cơ sở dữ liệu cần được kiểm soát theo phiên bản và được đánh giá trong quy trình duyệt mã.

Các bước của quy trình phiên bản hóa bao gồm:

4.2.1 Tính toán Sự khác biệt

Trước khi bắt đầu di chuyển, cần so sánh cấu trúc cơ sở dữ liệu hiện tại với trạng thái mong muốn và xác định sự khác biệt giữa hai trạng thái này. Điều này có thể được thực hiện bằng cách chạy lệnh atlas migrate diff.

atlas migrate diff create_blog_posts \
  --dir "file://migrations" \
  --to "file://schema.hcl" \
  --dev-url "docker://mysql/8/example"

--dir chỉ định URL của thư mục di chuyển, mặc định là file://migrations. --to chỉ định URL của trạng thái mong muốn (ví dụ, cơ sở dữ liệu môi trường phát triển của bạn), và --dev-url cung cấp một URL cho cơ sở dữ liệu phát triển được sử dụng để tính toán sự khác biệt (lưu ý rằng --dev-url cần phải chỉ định một cơ sở dữ liệu trống mà Atlas sử dụng để tính toán sự khác biệt).

Mẹo: Nếu bạn muốn tạo các tệp SQL, hãy tham khảo phần trước đó để thiết lập định dạng bằng cách sử dụng tham số --format.

4.2.2 Áp dụng Các thay đổi Di chuyển

Sau khi tính toán sự khác biệt hoàn tất, Atlas sẽ tạo ra hai tệp di chuyển được lưu trong thư mục migrations. Ví dụ, nếu định dạng được chọn là SQL, các tệp được tạo bởi lệnh diff, như tệp SQL sau, chứa các lệnh di chuyển để tạo bảng mới:

-- tạo bảng "blog_posts"
CREATE TABLE `blog_posts` (
  `id` int NOT NULL,
  `title` varchar(100) DEFAULT NULL,
  `body` text DEFAULT NULL,
  `author_id` int NULL REFERENCES `users`(id),
  PRIMARY KEY (`id`)
);

Khi các tệp di chuyển đã được tạo ra, bạn có thể sử dụng các công cụ kiểm soát phiên bản (ví dụ: Git) để quản lý những thay đổi này. Phương pháp này cho phép thực hiện nhiều sửa đổi cấu trúc bảng cơ sở dữ liệu trong môi trường phát triển và, khi đến lúc phát hành, so sánh môi trường phát triển và môi trường UAT bằng cách sử dụng các lệnh Atlas để tạo ra các tệp di chuyển cấu trúc bảng cơ sở dữ liệu. Những tệp di chuyển này sau đó có thể được áp dụng vào môi trường UAT và sản xuất để nâng cấp cơ sở dữ liệu.

Hai quy trình làm việc này, Để quy định và Có phiên bản, cung cấp tính linh hoạt cho các chế độ phát triển và triển khai khác nhau, cho phép các nhóm lựa chọn phương pháp phù hợp nhất với nhu cầu dự án của họ cho việc quản lý các thay đổi cấu trúc cơ sở dữ liệu.

5. Mô tả Định dạng HCL

5.1 Giới thiệu

HCL là một ngôn ngữ quy định được sử dụng để mô tả định nghĩa cấu trúc bảng cơ sở dữ liệu. Atlas sử dụng định dạng HCL để viết lược đồ cơ sở dữ liệu, cung cấp một cấu trúc phong phú để mô tả các khía cạnh khác nhau của cơ sở dữ liệu. Ưu điểm của HCL nằm ở khả năng đọc, dễ bảo trì và hỗ trợ cho các tính năng như tiêm biến và chú thích bổ sung.

Mẹo: Nếu dự án của bạn cần phải thích nghi với nhiều cơ sở dữ liệu, việc miêu tả cấu trúc bảng một cách độc lập với cơ sở dữ liệu bằng HCL có thể rất tiện lợi.

5.2 Đối tượng schema

Đối tượng schema được sử dụng để mô tả một lược đồ cơ sở dữ liệu. Trong MySQL và SQLite, nó đại diện cho DATABASE, trong khi trong PostgreSQL, nó đại diện cho SCHEMA. Một tệp HCL có thể chứa một hoặc nhiều đối tượng schema.

schema "public" {
  comment = "Một comment của lược đồ"
}

schema "private" {}

5.3 Đối tượng table

Đối tượng table được sử dụng để mô tả bảng trong cơ sở dữ liệu SQL, bao gồm cột, chỉ mục, ràng buộc và các thuộc tính bổ sung khác được hỗ trợ bởi các trình điều khiển cơ sở dữ liệu khác nhau.

table "users" {
  schema = schema.public
  column "id" {
    type = int
  }
  column "name" {
    type = varchar(255)
  }
  column "manager_id" {
    type = int
  }
  primary_key {
    columns = [
      column.id
    ]
  }
  index "idx_name" {
    columns = [
      column.name
    ]
    unique = true
  }
  foreign_key "manager_fk" {
    columns     = [column.manager_id]
    ref_columns = [table.users.column.id]
    on_delete   = CASCADE
    on_update   = NO_ACTION
  }
}

5.4 Đối tượng column

column là một tài nguyên con của table được sử dụng để định nghĩa các cột trong bảng.

column "name" {
  type = text
  null = false
}

column "age" {
  type = integer
  default = 42
}

column "active" {
  type = tinyint(1)
  default = true
}

5.5 Đối tượng primary_key

primary_key là một đối tượng con của table mô tả khóa chính của bảng.

primary_key {
  columns = [column.id]
}

5.6 Đối tượng foreign_key

foreign_key là một đối tượng con của table mô tả các cột tham chiếu đến các cột trong các bảng khác.

table "orders" {
  schema = schema.market
  // ...
  column "owner_id" {
    type = integer
  }
  foreign_key "owner_id" {
    columns     = [column.owner_id]
    ref_columns = [table.users.column.id]
    on_update   = NO_ACTION
    on_delete   = NO_ACTION
  }
}

5.7 Đối tượng index

Đối tượng index đại diện cho một chỉ mục trên bảng.

index "idx_name" {
  columns = [
    column.name
  ]
  unique = true
}