1

正如标题所示,我想将各种 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 中传递的向量中的方法。

4

1 回答 1

1
于 2022-01-12T15:04:39.870 回答