postgresql 参数的动态数组

yeotifhr  于 2023-02-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(149)

我必须在rust-postgres中构建一个运行时构建的select,它具有可变数量的参数(用户在运行时做出一些选择,我必须使用此时所需的参数构建select),因此我不能有一个

let baz = true;
let buzz : String = "ABCDE".to_string();
for row in client.query("SELECT foo FROM bar WHERE baz = $1 and buzz=$2", &[&baz, &buzz])?

因为我不知道,在编译的时候,参数的数量和类型是多少,可能一次有3个不同类型的参数,一次有6个参数。
我试着定义一个数组

let mut parameters : [&[()]; 4];

但是我不能在这个数组中放入一个引用,因为编译器报告我"类型不匹配",并且因为我不知道参数的数目。我该怎么解决这个问题呢?
编辑:我解释了我的需求。我们有一个自制的ERP,它有大量的统计查询,以满足营销/会计部门的需求。但他们要求更自由的查询功能,我的老板让我做一个QBE应用程序。当这个应用程序启动时,它显示一个DB表的列表。当用户单击一个表时,应用程序显示该表中的字段列表。他/她可以检查一些字段,并设置搜索值。例如:用户选择"worker"表。下一个表单显示了字段列表:名字,姓氏,生日,部门,等等。用户然后点击名称字段和一个窗口出现,所以他可以输入"约翰",然后点击"部门"字段和输入"研发"。然后点击运行按钮,和应用程序执行一个

SELECT ... FROM workers where name = {} and department = {}

所以我需要参数的数量是可变的,并且值的类型在运行时是可变的。

vsdwdz23

vsdwdz231#

首先,您需要存储用户输入。Vec非常适合:

let mut inputs = Vec::new();

while let Ok(input) = get_input() {
    inputs.push(input);
}

然后,你需要把这个Vec转换成&[&(dyn ToSql + Sync)],这样你就可以把它传递给query,因为它需要引用,所以我们把所有权留给原来的Vec,用引用创建一个新的Vec

let mut inputs_dyn: Vec<_> = inputs
    .iter()
    .map(|input| input as &(dyn ToSql + Sync))
    .collect();

现在可以将其作为切片传递给query

client.query("SELECT $1 FROM $2", inputs_dyn.as_slice())?

相关问题