我必须在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 = {}
所以我需要参数的数量是可变的,并且值的类型在运行时是可变的。
1条答案
按热度按时间vsdwdz231#
首先,您需要存储用户输入。
Vec
非常适合:然后,你需要把这个
Vec
转换成&[&(dyn ToSql + Sync)]
,这样你就可以把它传递给query
,因为它需要引用,所以我们把所有权留给原来的Vec
,用引用创建一个新的Vec
:现在可以将其作为切片传递给
query
: