CLI をインストール

Rust (Cargo)が使えるなら以下を叩くだけでインストールできます。

cargo install diesel_cli

もし、

failed to compile `diesel_cli v1.4.0`, intermediate artifacts can be found

のようなエラーが出た場合は以下も試してみると良いかもです。

cargo +stable install diesel_cli

ちゃんと入ったかバージョン確認だけ。

diesel --version
# diesel 1.4.0

migration

動作を見るためにここでは PostgreSQL を使います。接続できる適当なものが無い人は Docker で以下のように建てましょう。

docker run --rm -p 33445:5432 postgres

上記を使った場合、建てた PostgreSQL へはpostgres://postgres:@0.0.0.0:33445という URI で接続できます。

準備

さて migration ですが、最初に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