#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
чертой. Он может быть использован реализацией подключения к базе данных для получения списка параметров привязки для данного запроса, а не для построения запроса.