Help us understand the problem. What is going on with this article?

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

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の下の方に

にそれぞれあります。

techno-tanoC
Elixir, Haskell, Ruby, Rustが好き
mixi
全ての人に心地よいつながりを
http://mixi.co.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away