RustのORMであるDieselを使ってデータの取得・削除を一括で行いたい

前提

dieselを使って以下のHumansテーブルに対し、一括でfetch, deleteを行いたいです。(PostgresSQL v.14)

up.sql

1CREATE TABLE Humans ( 2 name VARCHAR(20) PRIMARY KEY, 3 information JSON NOT NULL 4); 5

model.rs

1#[derive(Insertable, Queryable, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] 2#[table_name = "humans"] 3pub struct Humans { 4 pub name: String, 5 pub information: serde_json::Value, 6}

現在はいずれも以下のようにイテレータやfor文を使って実装しています。

mod.rs

1pub fn fetch_humans(conn: &PgConnection, targets: &[String]) -> Vec<Option<Vec<Nodes>>> { 2 targets.iter() 3 .map(|target| { 4 schema::humans::dsl::humans 5 .filter(schema::humans::name.eq(target)) 6 .load::<Humans>(conn) 7 .optional() 8 .expect("Error fetching humans") 9 }) 10 .collect::<Vec<_>>() 11} 12 13pub fn delete_humans(conn: &PgConnection, targets: &[String]) { 14 for target in targets { 15 diesel::delete(schema::humans::dsl::humans) 16 .filter(schema::humans::name.eq(target)) 17 .execute(conn) 18 .expect("Error deleting humans"); 19 } 20}

やりたいこと

この実装でも問題ないのですが、クエリ回数を減らし、より効率的に処理したいと思っています。

diesel::insert_intoのように実現できれば嬉しいのですが、fetchやdeleteに関してはそのようなメソッドが用意されていません。(私が調べた限り)

考えたこと

diesel::sql_queryの中でWITH句を使った生のSQLを書けばできるかなと思ったのですが、targetsの中身を取り出してsql_queryの中に書き込む方法が分からず停滞しています。

もし、diesel固有の解決策やsql_queryでの解決策に知見がある方がいらっしゃれば、ご意見いただきたいです。

コメントを投稿

0 コメント