1. Atlasの紹介
Atlasは、現代のDevOps原則を使用してデータベーススキーマの管理と移行を目的として設計された、言語に依存しないツールです。以下の2つのワークフローオプションを提供しています。
- 宣言的: Terraformと同様に、AtlasはHCL、SQL、またはORMスキーマを使用して定義された目的の状態と現在のデータベースの状態を比較します。この比較に基づいて、データベースを目的の状態に移行するためのマイグレーション計画を生成および実行します。
- バージョン管理: 他のツールとは異なり、Atlasはスキーマのマイグレーションを自動的に計画します。ユーザーはHCL、SQL、または選択したORMを使用して目的のデータベーススキーマを記述し、Atlasを使用してデータベースに必要なマイグレーションの計画、レビュー、適用を行うことができます。
Atlasの主な利点の1つは、データベース管理の複雑さを単純化し、バージョン管理、協力、および実装を容易にすることです。
2. Atlasのインストール
データベースのバージョンを管理するためにAtlasを使用する前に、インストールする必要があります。以下はさまざまなプラットフォーム用のインストール手順です。
2.1 macOS + Linuxへのインストール
macOSまたはLinuxシステムでは、以下のコマンドラインを使用して、最新バージョンのAtlasをダウンロードしてインストールすることができます。
curl -sSf https://atlasgo.sh | sh
このコマンドは自動的にオペレーティングシステムのバージョンを検出し、適切なビルドバージョンをダウンロードしてAtlasバイナリファイルを実行可能なパスに配置します。
2.2 Homebrewを使用したインストール
macOSを使用しており、すでにHomebrewパッケージマネージャをインストールしている場合、次のコマンドを実行するだけでAtlasを簡単にインストールできます。
brew install ariga/tap/atlas
これにより、Homebrewのリポジトリから最新バージョンのAtlasが取得され、インストールされます。
2.3 Dockerを使用したインストール
Dockerを介してAtlasをインストールおよび実行する方法は、特に一時的なテスト用途やホストシステムに追加のソフトウェアをインストールしたくないユーザーにとって、迅速で便利な方法です。
まず、Atlas Dockerイメージを取得します。
docker pull arigaio/atlas
次に、正常にインストールされているかを確認するために、ヘルプコマンドを実行できます。
docker run --rm arigaio/atlas --help
コンテナがホストネットワークやローカルディレクトリにアクセスする必要がある場合は、--net=host
フラグを使用し、必要なディレクトリをマウントします。
docker run --rm --net=host \
-v $(pwd)/migrations:/migrations \
arigaio/atlas migrate apply \
--url "mysql://root:pass@:3306/test"
2.4 Windowsへのインストール
バイナリファイルhttps://release.ariga.io/atlas/atlas-windows-amd64-latest.exeをダウンロードし、インストールパスをシステムのPATH環境変数に追加します。
3. Atlasを使用して既存のデータベーステーブル構造をエクスポートする方法
Atlasには、既存のデータベースの構造をエクスポートするための atlas schema inspect
コマンドがあります。このコマンドは、データベースの説明をデータベースのURLから読み取り、デフォルトのAtlas HCL形式、SQL形式、およびJSON形式の3つの異なる形式で出力できます。このガイドでは、Atlas HCL形式とSQL形式の使用方法を説明し、JSON形式は通常、jq
を使用して出力を処理するために使用されます。
ローカルで実行されているMySQLインスタンスを検査し、出力を schema.hcl
というファイルに書き込むには、次のコマンドを使用します:
atlas schema inspect -u "mysql://root:pass@localhost:3306/example" > schema.hcl
schema.hcl
ファイルを開いて、データベースを記述するAtlasのテーブル構造定義を表示します(HCLはAtlasによって定義されたデータベースに依存しないテーブル構造の構成形式です)。例えば、このファイルには次の内容が含まれます:
table "users" {
schema = schema.example
column "id" {
null = false
type = int
}
column "name" {
null = true
type = varchar(100)
}
primary_key {
columns = [column.id]
}
}
このコードブロックは、id
と name
の列を持つテーブル構造を表しています。schema
フィールドは、このドキュメントの他の場所で定義された example
モデル定義を参照しています。また、primary_key
のサブブロックは、テーブルの主キーとして id
列を指定しています。Atlasは操作されているデータベースの構文を模倣しようとしています。この例では、id
列は int
型であり、name
列は varchar(100)
型であることが示されています。
同様に、データベースのSQLモデル定義をエクスポートするには、次のコマンドを使用します:
atlas schema inspect -u "mysql://root:pass@localhost:3306/example" --format '{{ sql . }}' > schema.sql
schema.sql
ファイルを開いて、通常はいくつかのCREATE TABLEステートメントを含んでいるデータベースのSQLの説明を表示します。
この方法により、既存のデータベーステーブル構造の詳細を理解するのが便利になり、後続のバージョン管理されたマイグレーションの正確な参照が提供されます。
4.2.1 差分の計算
マイグレーションを開始する前に、現在のデータベース構造と目標の状態を比較し、両者の違いを特定する必要があります。これは atlas migrate diff
コマンドを実行することで実現できます。
atlas migrate diff create_blog_posts \
--dir "file://migrations" \
--to "file://schema.hcl" \
--dev-url "docker://mysql/8/example"
--dir
はマイグレーションフォルダのURLを指定し、デフォルトは file://migrations
です。 --to
は目標状態のURLを指定し、--dev-url
は差分を計算するのに使用する開発用データベースのURLを提供します(注意:この --dev-url
は、差分を計算するためにAtlasが使用する空のデータベースを指定する必要があります)。
ヒント:SQLファイルを生成する場合は、
--format
パラメータを使用してフォーマットを設定するため、前のセクションを参照してください。
4.2.2 マイグレーションの適用
差分の計算が完了すると、Atlas は migrations
フォルダに保存された2つのマイグレーションファイルを生成します。たとえば、選択したフォーマットがSQLの場合、diff
コマンドによって生成されるファイルは以下のような、新しいテーブルを作成するためのマイグレーションコマンドを含むSQLファイルです:
-- "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`)
);
マイグレーションファイルが生成されたら、これらの変更を管理するためにバージョン管理ツール(例: Git)を使用できます。この方法を使用すると、開発環境で多くのデータベーステーブル構造の変更を行うことができます。そしてリリース時に、開発環境とUAT環境を比較するためにAtlasコマンドを使用して、データベーステーブル構造のマイグレーションファイルを生成することが可能です。これらのマイグレーションファイルは、UAT環境と本番環境に適用してデータベースをアップグレードすることができます。
これらのDeclarativeおよびVersionedの2つのワークフローは、さまざまな開発および展開モードに柔軟性を提供し、データベーススキーマの変更を管理するためのプロジェクトのニーズに最も適した方法をチームが選択できるようにします。
5. HCL形式の記述
5.1 導入
HCLはデータベーステーブル構造の定義を記述するために使用される宣言型の言語です。Atlas は、データベーススキーマを記述するためにHCL形式を使用し、データベースのさまざまな側面を記述するための豊富な構造を提供します。HCLの利点は、可読性と保守性の高さ、および変数の注入や追加の注釈などの機能のサポートにあります。
ヒント:プロジェクトが複数のデータベースに適応する必要がある場合、HCLを使用してデータベースに依存しない方法で表の構造を記述することは非常に便利です。
5.2 schema
オブジェクト
schema
オブジェクトはデータベーススキーマを記述するために使用されます。MySQLおよびSQLiteでは、DATABASE
を、PostgreSQLでは SCHEMA
を表します。HCLファイルには1つ以上のschema
オブジェクトが含まれることがあります。
schema "public" {
comment = "スキーマのコメント"
}
schema "private" {}
5.3 table
オブジェクト
table
オブジェクトはSQLデータベースのテーブルを記述するために使用され、列、インデックス、制約、および異なるデータベースドライバがサポートするさまざまな追加プロパティを含みます。
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 column
オブジェクト
column
は、テーブル内の列を定義するために使用される table
のサブリソースです。
column "name" {
type = text
null = false
}
column "age" {
type = integer
default = 42
}
column "active" {
type = tinyint(1)
default = true
}
5.5 primary_key
オブジェクト
primary_key
は、テーブルの主キーを定義するtable
のサブリソースです。
primary_key {
columns = [column.id]
}
5.6 foreign_key
オブジェクト
foreign_key
は、他のテーブルの列を参照する列を定義するtable
のサブリソースです。
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 index
オブジェクト
index
オブジェクトは、テーブルのインデックスを表します。
index "idx_name" {
columns = [
column.name
]
unique = true
}