WHRER句マクロ

QueryBuilderで使用するWHRER句はマクロで記述されます。
基本的に比較演算子の左側にカラム名、右側に値となります。
マクロはそのままテキスト化ではなく、プリペアードステートメントに変換されますので、SQLインジェクションは発生しません。 他のテーブルとの結合はJOINではなく、EXISTSで判定します。膨大なブログから表示可能な新着数件を抽出などではJOINよりもEXISTSのほうが早く取得できます。

#![allow(unused)]
fn main() {
let cond = db_{DB名}::cond_{グループ名}_{モデル名}!(クエリー);
let cond = db_sample::cond_note_note!(color = _Color::c);
let cond = db_sample::cond_note_note!(content = "ddd");
let cond = db_sample::cond_note_note!(NOT(note_id = id));
let cond = db_sample::cond_note_note!(note_id BETWEEN (3, 5));
let cond = db_sample::cond_note_note!(note_id SEMI_OPEN (3, 5));
let cond = db_sample::cond_note_note!((note_id < c) AND (note_id < 20) AND (note_id IN (3,3)));
let cond = db_sample::cond_note_note!((NOT ((note_id < c) AND (note_id < 1) AND (note_id < 2))) OR (note_id < 3) OR (note_id < 4));
let cond = db_sample::cond_note_note!(note_id ANY_BITS c);
let cond = db_sample::cond_note_note!(ONLY_TRASHED AND (category EXISTS (name = "diary")));
let cond = cond.and(db_sample::cond_note_note!(json CONTAINS [3,5]));
let result = _Note::query().cond(cond).select(conn).await?;
}

SEMI_OPENはBETWEENに似ていますが、半開区間 3 <= note_id AND note_id < 5 のように変換されます。

order by については下記のようになります。 IS NULL ASCの指定も可能ですが、インデックスの最適化は得られない可能性があります。

#![allow(unused)]
fn main() {
let order = db_sample::order_by_note_note!(note_id IS NULL ASC, note_id ASC);
let result = _Note::query().order_by(order).select(conn).await?;
}