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の下の方に
にそれぞれあります。