我在Rust项目中使用tokio-postgres,其中我有查询参数。
rows = client.query(QUERY, &[&input1, &input2.unwrap()]).await.expect("error");
QUERY看起来像这个
QUERY: &str = "SELECT * FROM Table WHERE Name=$1 AND Address= COALESCE($2, Address);"
input2
属于Rust选项类型,在将input2插入查询方法之前,我必须先打开它。有没有一种方法可以使查询方法处理";无";直接地我可以在外部编写条件语句,但对于有多个可选查询的情况,这将使源代码无法管理。
使用原始查询时,tokio_postgres无法管理None
。根据我的经验,最好的解决方案是编写自己的查询生成器。
您根本不需要.unwrap()
,可以按原样传递&input2
。Option<T>
实现ToSql
,其中T: ToSql
,如果值为None
,则它将把NULL
传递到数据库:
let rows = client.query(
"SELECT * FROM Table WHERE Name=$1 AND Address=COALESCE($2, Address)",
&[&input1, &input2],
).await?;
我在本地数据库上测试的完整工作代码在这里可用。