動作を見るためにここでは PostgreSQL を使います。接続できる適当なものが無い人は Docker で以下のように建てましょう。
docker run \
--rm \
-p 33445:5432 \
-e POSTGRES_HOST_AUTH_METHOD=trust \
postgres
これにはpostgres://postgres:@0.0.0.0:33445
という
URI で接続できます。
準備
最初にdiesel setup
という準備コマンドを叩く必要があります。その際上記の URI を指定します。
注意点としてこのコマンドはCargo.toml
を持つディレクトリで実行する必要があります。
# cargo init sandbox && cd sandbox
diesel setup --database-url postgres://postgres:@0.0.0.0:33445
実行後migrations/
ディレクトリがこのような構造でできます。
migrations
└── 00000000000000_diesel_initial_setup
├── down.sql
└── up.sql
migration
準備ができたので migration ファイルを作っていけます。例えば以下のようなコマンドを叩きます。
diesel migration generate create_notes_table
先程のmigration/
の中身にこれ用のup.sql
とdown.sql
が作られたハズです。
migrations/
├── 00000000000000_diesel_initial_setup
│ ├── down.sql
│ └── up.sql
└── 2020-01-17-090405_create_notes_table
├── down.sql
└── up.sql
up.sql
とdown.sql
の内容をそれぞれ以下のようにしてみます。
-- `up.sql`
CREATE TABLE notes (
id SERIAL PRIMARY KEY,
title VARCHAR(128) UNIQUE NOT NULL
)
-- `down.sql`
DROP TABLE notes
これらを適用するにはmigration run
コマンドを実行します。URI も忘れずに。
diesel migration run --database-url postgres://postgres:@0.0.0.0:33445
# Running migration 2020-01-17-090405_create_notes_table
無事終わったら今度は戻すときのコマンドも問題ないかmigration redo
で確認します。
diesel migration redo --database-url postgres://postgres:@0.0.0.0:33445
# Rolling back migration 2020-01-17-090405_create_notes_table
# Running migration 2020-01-17-090405_create_notes_table
どうやら大丈夫そうです。戻すだけのmigration revert
コマンドもあり、連続で叩いて好きな所まで戻れます。
--database-url を省略
dotenv
モジュールをサポートしているので、.env
へDATABASE_URL
を書き込むとそっちを優先して使ってくれます。
echo 'DATABASE_URL=postgres://postgres:@0.0.0.0:33445' > .env
diesel migration redo
# Rolling back migration 2020-01-17-090405_create_notes_table
# Running migration 2020-01-17-090405_create_notes_table