Как добавить несколько привязок sql_query одновременно?

#postgresql #rust #rust-diesel

Вопрос:

Я использую diesel crate для связи с базой данных PostgreSQL. У меня есть вариант использования, когда я хочу получить данные из таблицы preferences в структуру Preferences . Я хочу, чтобы на выходе из базы будут filterd на буксире полей в таблице, чтобы иметь определенное значение в столбце org_id и чтобы быть в группе значений в столбце team_id , который я храню их значений в неизвестных длина массива, поэтому я не могу сделать sql_query(raw_sql).bind::<>().execute() потому что я не знаю количество bind::<>() затем я попытался использовать collect_binds но это не сработало, я попытался сделать следующее

 let mut filter = "".to_string();
let mut params:Vec<i64> = vec![];
let mut c =1;
let org_id = 10;

filter.push_str("(org_id=$1 AND team_id IN (");
params.push(org_id);
for team_id in get_needed_teams_id(){
     c = c  1;
     filter.push_str(amp;*format!("${}", c));
     params.push(team_id );
}
filter.push_str("))");


let raw_sql = format!("SELECT * FROM preferences WHERE {} ORDER BY user_id ASC, team_id ASC", filter);

let preferences:Vec<Preferences> = vec![];
let sql_res = sql_query(raw_sql).collect_binds(amp;mut param, amp;preferences);
 

Возвращена ошибка :

 error[E0284]: type annotations needed: cannot satisfy `<_ as Backend>::BindCollector == Vec<i64>`
   --> srcdbpreference_db.rs:146:38
    |
146 |     let sql_res = sql_query(raw_sql).collect_binds(amp;mut params, amp;preferences);
    |                                      ^^^^^^^^^^^^^ cannot satisfy `<_ as Backend>::BindCollector == Vec<i64>`
 

Ответ №1:

В настоящее время в diesel нет способа связать несколько параметров одновременно в цикле. collect_binds совершенно не связан с этим и экспортируется QueryFragment чертой. Он может быть использован реализацией подключения к базе данных для получения списка параметров привязки для данного запроса, а не для построения запроса.