🚂
備忘録: Diesel入門
Getting Started
DieselはRustのORMライブラリ。
本家Getting Startedに従って、Dieselを使ってみたときのメモ。
環境
- ubuntu 22.04
- Rust edition 2021
- postgresql 14
インストール
diesel_cliのインストールにはcargo使うのが一番楽だと思う。(本家ではなぜか一番下にあるが)
cargo install diesel_cli
実行
show_posts.rsを実行すると以下のエラーが出た。
/usr/bin/ld: cannot find -lpq: No such file or directory
collect2: error: ld returned 1 exit status
本家のコラム"A note on installing diesel_cli"と同様で、libpqが見つからないというエラー。
libpqの解決
ライブラリの検索
ldconfig -p | grep libpq
見つかったら、シンボリックリンクを張る
sudo ln -s /lib/x86_64-linux-gnu/libpq.so.5 /lib/x86_64-linux-gnu/libpq.so
見つからなかったらlibpqをインストール。
参考:https://please-sleep.cou929.nu/20080718.html
プログラム全般
以下をファイル頭に書いておくと楽。
use self::models::*;
use diesel::prelude::*;
use diesel_demo::*;
個人的につまづいたところ
posts, id, title, body, publishedとは
唐突に出てくるが、これはschema.rsからマクロ生成された構造体。
それぞれpostsはテーブル名と、id, title, body, publishedはカラム名と対応した構造体。
これらはcargo expandでschema.rsをマクロ展開してみるとなんとなくわかる。
つまりpostsの例では以下のuseは
use self::schema::posts::dsl::*;
以下と等価で、
use schema::posts::columns::id;
use schema::posts::columns::title;
use schema::posts::columns::body;
use schema::posts::columns::published;
use schema::posts::table as posts;
以下のような構造体を参照している。
pub struct table;
...
pub struct id;
...
pub struct title;
...
pub struct body;
...
pub struct published;
...
さらには、構造体がidといった一般的な名前なので、上記のことを知らなければ変数名と重複してしまっても気づきにくい。
cargo expandでマクロ展開してlessで見るとき
cargo expand --lib schema::posts --color always| less -R
rust-analyzerがミスる
.filterの有無でinlay hintsが出なくなる。
どこのバグかわからないがrust-analyzer無しではrust書けないため困る。
追記:rust-analyzer側の既知のバグらしい。
Discussion