Migration

動作を見るためにここでは 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.sqldown.sqlが作られたハズです。

migrations/
├── 00000000000000_diesel_initial_setup
│   ├── down.sql
│   └── up.sql
└── 2020-01-17-090405_create_notes_table
    ├── down.sql
    └── up.sql

up.sqldown.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モジュールをサポートしているので、.envDATABASE_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