Edited at

dieselのサンプル(sqlite)を動かしてみた

More than 1 year has passed since last update.

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


依存


Cargo.toml

[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ファイルが生成されます。テーブル定義を書いていきます。


up.sql

CREATE TABLE posts (

id INTEGER NOT NULL PRIMARY KEY,
title VARCHAR NOT NULL,
body TEXT NOT NULL,
published BOOLEAN NOT NULL DEFAULT 0
)


down.sql

DROP TABLE posts


Postgresのサンプルではup.sqlidの型はSERIALなのですがSQLiteは違うので注意です。

$ diesel migration run


書く!

あとはdieselのサンプルコードを写していけばいいのですが2017年7月31日のmasterブランチでの変更がリリースされているものに反映されていないため0.15.xブランチのサンプルでないと動かないので注意です。

具体的にはこのコミットsrc/lib.rsuse diesel::sqlite::SqliteConnection;が消えています。

そのうちmasterのサンプルソースでも動くようになると思います。


動かす

$ cargo run --bin show_posts

のように実行します。

sqlite3を起動してselect * from posts;などで確認しながらサンプルを進めていくと楽しいかもしれません。


ドキュメント

filterselectjoinexecuteなどの関数はdiesel::preludeにある○○Dsl

検索時などに使うeqgtなどはdiesel::expression_methods::global_expression_methods::ExpressionMethods

associationはdiesel::associations

countexistsmaxmixdiesel::expression::dsl

insertupdatedeletedieselの下の方に

にそれぞれあります。