rustをポチポチ触り始めました。rustでデータベースを触りたかったのでdieselのサンプルをいじってみました。
リポジトリのexampleにはSQLiteの具体的な手順が書いてなくて多少苦労したので備忘録を兼ねて書きます。
サンプルソース自体の解説はしませんRustのことが全然分かっていないので解説できません。
diesel
Dieselは「A safe, extensible ORM and Query Builder for Rust」らしいです。
rustのORMの中では一番流行っているようなのでこれを選びました。
環境
ubuntu16.04
SQLite 3.11.0
rustup 1.5.0
rustc 1.21.0-nightly
cargo 0.22.0-nightly
diesel 0.15.0
rustcはnightlyでなくても良いかもしれません。
準備
sqlite3をインストールしておいてください。
diesel_cliをインストールしてdieselコマンドを使えるようにします。postgresqlやmysqlが入っていない場合エラーになるので、以下のようにオプションでsqliteだけをターゲットにしましょう。
$ cargo install diesel_cli --no-default-features --features sqlite
プロジェクトを作る
$ cargo new diesel_sample
$ cd diesel_sample
依存
[package]
name = "diesel_sample"
version = "0.1.0"
authors = ["techno"]
[dependencies]
diesel = { version = "0.15.0", features = ["sqlite"] }
diesel_codegen = { version = "0.15.0", features = ["sqlite"] }
dotenv = "0.9.0"
データベースを作る
$ echo DATABASE_URL=./sample.db > .env
$ diesel setup
dieselは.envに書かれたURLを元にデータベースに接続するので、データベースのURL(今回はデータベースファイルのパス)を.envに出力後diesel setupを打ちます。
最初DATABASE_URL="./sample.db"と書いたためにエラーを吐かれてしばらくハマりました。
マイグレーション
$ diesel migration generate create_posts
migrationsディレクトリにマイグレーション用のSQLファイルが生成されます。テーブル定義を書いていきます。
CREATE TABLE posts (
  id INTEGER NOT NULL PRIMARY KEY,
  title VARCHAR NOT NULL,
  body TEXT NOT NULL,
  published BOOLEAN NOT NULL DEFAULT 0
)
DROP TABLE posts
Postgresのサンプルではup.sqlのidの型はSERIALなのですがSQLiteは違うので注意です。
$ diesel migration run
書く!
あとはdieselのサンプルコードを写していけばいいのですが2017年7月31日のmasterブランチでの変更がリリースされているものに反映されていないため0.15.xブランチのサンプルでないと動かないので注意です。
具体的にはこのコミットでsrc/lib.rsのuse diesel::sqlite::SqliteConnection;が消えています。
そのうちmasterのサンプルソースでも動くようになると思います。
動かす
$ cargo run --bin show_posts
のように実行します。
sqlite3を起動してselect * from posts;などで確認しながらサンプルを進めていくと楽しいかもしれません。
ドキュメント
filterやselect、join、executeなどの関数はdiesel::preludeにある○○Dsl
検索時などに使うeqやgtなどはdiesel::expression_methods::global_expression_methods::ExpressionMethods
associationはdiesel::associations
countやexists、max、mixはdiesel::expression::dsl
insert、update、deleteはdieselの下の方に
にそれぞれあります。