前提
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 コメント