ent. と atlas を利用したスキーマの可視化
1. はじめに
GolangでORMを使うなら ent. がおすすめ!の記事で、ent.の紹介をした続きになります。
前回は、atlasを利用したスキーマの可視化を省いて説明したので、今回はその紹介になります。
🤔「ent.って何・・・?」という方は、前回の私の記事を読んでいただけると少し分かるかもしれません!(宣伝
2.atlas って何?
atlasは、2021年に設立されたarigaからOSSで提供されている「モダンなDevOps原則に従ったデータベーススキーマの管理とマイグレーションツール」です。
主に、以下の2つの機能を提供してくれます。
- Declarative: Terraformと同様、Atlasはデータベースの現在の状態と、HCL、SQL、ORMスキーマで定義された望ましい状態を比較する。この比較に基づいて、データベースを望ましい状態に移行するための移行計画を生成し、実行する。
- Versioned: バージョン管理 他のツールとは異なり、Atlasは自動的にスキーマのマイグレーションを計画します。ユーザーは、HCL、SQL、または選択したORMで希望のデータベーススキーマを記述し、Atlasを利用することで、必要なマイグレーションを計画し、リントし、データベースに適用することができます。
Key Featuresを見ると色々な機能があり使いこなすのは中々難しいですが、今回はent.のQuick Introductionに記載されているVisualize the Schemaに焦点を当てて利用します。
3. 開発環境
以下に、筆者の開発環境と本記事で利用するリポジトリを記載します。
- golang v1.21.4
- docker 4.16.2
- postgresql 16.1
- ent. v0.12.5
- atlas v0.15.1-04e0010-canary
4. atlasを利用した可視化の方法
ent.のQuick Introdctuionで作成したスキーマを可視化するには、以下の手順に従って下さい。
4-1. atlasのインストール
まずは、atlasのインストールしましょう。
私は以下のようにbrewを利用してインストールしました。
brew install ariga/tap/atlas
brew以外の方法でインストールしたい方は、installationを参照して下さい。
インストールが完了したら、以下のようにコマンドが動作するか確認しておきましょう。
atlas -h
正常にインストールが完了していると、以下のように出力されます。
沢山コマンドがありますが、今回利用するのはschema
コマンドになります。
A database toolkit.
Usage:
atlas [command]
Available Commands:
completion Generate the autocompletion script for the specified shell
help Help about any command
license Display license information
login Log in to Atlas Cloud.
logout Logout from Atlas Cloud.
migrate Manage versioned migration files
schema Work with atlas schemas.
version Prints this Atlas CLI version information.
Flags:
-h, --help help for atlas
Use "atlas [command] --help" for more information about a command.
4-2. ent.のチュートリアルが完了しているリポジトリを取得
前回の記事でスキーマの定義まで完了しているリポジトリを用意しているので、それを取得して下さい。
git clone git@github.com:KaiTakabe0301/entdemo.git
4-3. スキーマからHCLファイルの作成
atlasでスキーマを可視化するには、hcl形式のファイルかSQL形式のファイルを出力する必要があります。
本節では、hcl形式でファイルを出力することにします。
また、hclのファイル出力方法も複数あるので、ここではそれらの方法も解説します。
4-3-1. Dev Databaseを利用した方法
atlasには、Dev Databaseという機能があります。
これは、atlasに搭載されている特殊なdocker driverを利用することで一時的に検証用のデータベースを立ち上げることができるものです。
これを利用することで、データベースを立ち上げずともHCL形式でスキーマの可視化が可能です。
では、早速Dev Databaseを利用して、スキーマの可視化を行いましょう。
まずは、4-2節で取得したリポジトリに移動して、以下のコマンドを実行して下さい。
atlas schema inspect \
-u "ent://ent/schema" \
--dev-url "docker://postgres/15/dev?search_path=public"
実行結果を記載する前に、簡単にコマンドの説明をしておきます。
-
atlas schema inspect
で、データベースの解析を行いスキーマの可視化を行います -
-u
オプションで、解析対象のリソースを設定します。
データベースのURLやスキーマのファイルパスをdriver://username:password@address/dbname?param=value
設定することができます。
今回はent.のスキーマを設定したかったので、driverにent
を指定し、ファイルパスとしてent/schema
を設定しています。 -
--dev-url
オプションで、Dev Databaseを利用できます。利用できるdriverは、URLsから確認できます。
今回は、docker driverからpostgresqlを利用したかったので"docker://postgres/15/dev?search_path=public"
を設定しています。
コマンドが正常に終了すると、スキーマを解析した結果が以下のようにHCL形式で出力されます。
atlas schema inspect \
-u "ent://ent/schema" \
--dev-url "sqlite://file?mode=memory&_fk=1"
}
primary_key {
columns = [column.group_id, column.user_id]
}
foreign_key "group_users_group_id" {
columns = [column.group_id]
ref_columns = [table.groups.column.id]
on_update = NO_ACTION
on_delete = CASCADE
}
foreign_key "group_users_user_id" {
columns = [column.user_id]
ref_columns = [table.users.column.id]
on_update = NO_ACTION
on_delete = CASCADE
}
}
table "groups" {
schema = schema.public
column "id" {
null = false
type = bigint
identity {
generated = BY_DEFAULT
}
}
column "name" {
null = false
type = character_varying
}
primary_key {
columns = [column.id]
}
}
table "users" {
schema = schema.public
column "id" {
null = false
type = bigint
identity {
generated = BY_DEFAULT
}
}
column "age" {
null = false
type = bigint
}
column "name" {
null = false
type = character_varying
default = "unknown"
}
primary_key {
columns = [column.id]
}
}
schema "public" {
comment = "standard public schema"
}
このままだと、HCLファイルは作成されないので通常は以下のように適当なファイルに結果を出力します。
atlas schema inspect \
-u "ent://ent/schema" \
--dev-url "docker://postgres/15/dev?search_path=public" > entdemo.hcl
4-3-2. データベースを参照する方法
4-2節で取得したリポジトリに移動して、以下のコマンドを実行してpostgresqlを立ち上げて下さい。
docker-compose up -d
立ち上がったら、go run start.go
を実行してデータベースのマイグレーションを行なって下さい。
※チュートリアルを実施済みの方は不要です。
あとは、以下のコマンドを実行して、HCL形式のファイルを作成するだけです。
atlas schema inspect -u "postgres://postgres:password@localhost:5432/entdemo?sslmode=disable" > entdemo.hcl
先ほどと異なり--dev-url
を利用していないことがわかります。
4-4. スキーマの可視化
可視化はいつになったらできるんだよ!?と思っている皆様、やっと可視化の準備が整いました!
可視化の方法も2パターンあるので、それらを順に説明します。
4-4-1. HCLファイルをatlas cloudのExploreに貼り付ける方法
まずは、先ほど保存したentdemo.hcl
を利用した方法を紹介します。
entdemo.hcl
をクリップボードにコピー
4-4-1-1. 筆者はmacを利用しているので、以下のコマンドでコピーしています。
cat entdemo.hcl | pbcopy
4-4-1-2. atlas cloudにアクセス
コピーが完了したら、atlas cloudのplaygroundにアクセスします。
アクセスすると、こんな画面になっているかと思います。
4-4-1-3. クリップボードの内容をコピーして可視化
以下の画像に従って、クリップボードの内容をコピーして、「Visualize」をクリックして下さい
そうすると、以下の画像のようにスキーマの可視化ができます。
※以下の画像では、外部キーを表現する矢印が見にくかったので位置をずらしています。
atlas schema inspect
から直接可視化する方法
4-4-2. 可視化するだけなら、実はもっと簡単な方法があります・・・
それは、4-3-2項で実行したコマンドを少し弄って、以下のようにします。
atlas schema inspect -u "postgres://postgres:password@localhost:5432/entdemo?sslmode=disable" -w
ファイルの出力をやめた代わりに、-w
オプションが付いています。
このオプションを付与して実行すると、以下のようにatlas cloudで公開するか、もしくは個人や組織のworkspaceに出力かを選択できます。
atlas schema inspect -u "postgres://postgres:password@localhost:5432/entdemo?sslmode=disable" -w
? Where would you like to share your schema visualization?:
▸ Publicly (gh.atlasgo.cloud)
Your personal workspace (requires 'atlas login')
現時点では、atlas cloudにアカウントを用意していないので「Publicly」を選択します。
すると、自動的にブラウザが開いて、先ほどと同様の画面が表示されます。
また、この際に公開用のURLも生成されるので、ご注意下さい(私のURLは、 https://gh.atlasgo.cloud/explore/9c90f96c でした)
5. さいごに
本記事では、atlasを用いたスキーマの可視化を説明しました。
ぶっちゃけた話をしてしまえば、これだけの使い方だと機能としては微妙です。
atlasの真価は、マイグレーションのバージョン管理と組み合わせて初めて発揮されます。
次回は、ent.とatlasを用いたマイグレーションのバージョン管理の方法を記事しますので、お付き合い頂けると幸いです!
Discussion