не так с .bind() в 3ем варианте. Сталкивался кто? #[derive(serde_derive::Deserialize, sqlx::FromRow)]
struct IdWrapper { id: i64 }
//1 works
let id_handle = "id";
sqlx::query_as::<sqlx::Postgres, IdWrapper>(&format!("SELECT {id_handle} FROM example")).fetch_all(postgres_pool).await
//2 works
sqlx::query_as!(IdWrapper, "SELECT id FROM example").fetch_all(postgres_pool).await
//3 runtime error: column not found: id
let mut query = sqlx::query_as::<sqlx::Postgres, IdWrapper>(&format!("SELECT $1 FROM example"));
query = query.bind("id");
query.fetch_all(postgres_pool).await
//4 compile time error: column name "?column?" is invalid: "" is not a valid Rust identifier
let id_handle = "id";
sqlx::query_as!(IdWrapper, "SELECT $1 FROM example", id_handle).fetch_all(postgres_pool).await
на уровне интуиции, там получается запрос select "id" from example потому что бинд подсталяет значения в переменные иначе как он ещё может подставить строку
format!("{}") получается придется использовать?
не могу представить сценарий, в котором может понадобиться параметризовать название атрибута
динамически запрашивать columns. типо если в таблице есть только id и name - есть 3 варианта - запрос только id, запрос только name и запрос id + name.
Ммм, инъекции
я создал энам который десериализую с помощью serde для table column вариантов. id, name, id+name. по сути иньекции не должно быть
необычный подход. ну тогда склеивать имена колонок и подставлять в запрос наверное...
Думал есть еще второй вариант. Написать энум для всех вариантов селекта колонок, сделать match по нему и подставлять сгенерированный с помощью макроса query as. По сути все это можно сделать зная лишь токенстрим структуры описывающей row в table
Обсуждают сегодня