🚂

備忘録: Diesel入門

2024/10/16に公開

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側の既知のバグらしい。
https://github.com/rust-lang/rust-analyzer/issues/14607

GitHubで編集を提案

Discussion