正如标题所示,我想将各种 SQLX 类型存储在一个向量中以进行手动查询构建。这是我最好的尝试:
use sqlx::{Database, Encode, Type};
use sqlx::database::HasArguments;
use sqlx::query::QueryScalar;
pub type SqlVec<'q, DB: Database> = Vec<Box<dyn SqlTrait<'q, DB>>>;
pub trait SqlTrait<'q, DB: Database>: Send + Encode<'q, DB> + Type<DB> {}
impl<'q, DB: Database, U> SqlTrait<'q, DB> for U where U:Send + Encode<'q, DB> + Type<DB> {}
pub trait SqlVecTrait<'q, DB: Database> {
fn add<T: SqlTrait<'q, DB>>(&mut self, value: T);
}
impl<'q, DB: Database> SqlVecTrait<'q, DB> for SqlVec<'q, DB> {
fn add<T: SqlTrait<'q, DB>>(&mut self, value: T) {
self.push(Box::new(value))
}
}
该代码将像这样使用:
let mut query = "SELECT * FROM stuff WHERE num = $1".to_string();
let mut args = SqlVec::new();
args.add(3);
if condition {
query += ", code = $2";
args.add("s");
}
let mut query = sqlx::query(&query);
for value in args.iter() {
query = query.bind(value);
}
let rows = query.fetch(&mut db_pool);
编译器抱怨DB
由于有几个方法没有采用self
. 在文档中和我无数次的搜索中,我还没有找到一种将不同类型存储在可以bind
在 SQLX 中传递的向量中的方法。