我正在try 使用WHERE子句动态创建一个查询,现在遇到了一个问题,我想使用PUSH_BIND来添加一个值,因为它是用户输入.

但我有以下问题.如果我使用PUSH_BIND构建查询,则不会得到任何值:

if let Some(test) = &param.test{
    query_builder.push(" AND \"Test\" ilike '%");
    query_builder.push_bind(test);
    query_builder.push("%'");
}

另一方面,如果我只使用推送来构建查询,则会得到期望值:

if let Some(test) = &param.test{
    query_builder.push(" AND \"Test\" ilike '%");
    query_builder.push(test);
    query_builder.push("%'");
}

有人能解释一下push_bind在内部做什么吗?或者我通常如何使用sqlx做这件事?

推荐答案

push只是将您传递给查询的文字字符串推送到查询,因此它很容易受到SQL注入的攻击,如文档中所述, 另一方面,push_bind将查询占位符?推送到查询(并将值绑定到它,但这在这里不相关),就像documentation所说的那样

因此,您的push_bind变量最终将" AND \"Test\" ilike '%?%'"推送到查询,这是毫无意义的.相反,您可以连接3个不同的字符串:

if let Some(test) = &param.test {
    query_builder.push(" AND \"Test\" ilike concat('%', ");
    query_builder.push_bind(test);
    query_builder.push(", '%')");
}

提示:你可以用into_sql方法来判断QueryBuilder生成的SQL.

Rust相关问答推荐

给定使用newype习语定义的类型上的铁 rust Vec,有没有方法获得底层原始类型的一部分?

rust 蚀将动力特性浇到混凝土 struct 上是行不通的

PyReadonlyArray2到Vec T<>

MutexGuard中的过滤载体不需要克隆

亚性状上位性状上的 rust 病伴生型界限

无法将记录器向下转换回原始 struct

使用铁 rust S还原对多个数组执行顺序kronecker积

如何在递归数据 struct 中移动所有权时变异引用?

使用Py03从Rust调用Python函数时的最佳返回类型

Windows 上 ndarray-linalg 与 mkl-stats 的链接时间错误

具有多个键的 HashMap

Rust 1.70 中未找到 Trait 实现

在每个循环迭代中删除borrow

n 个范围的笛卡尔积

为什么会出现无法移出可变引用后面的 `self.x`错误?

为什么拥有 i32 所有权的函数需要它是可变的?

火箭整流罩、tokio-scheduler 和 cron 的生命周期问题

基于名称是否存在的条件编译

返回 &str 但不是 String 时,borrow 时间比预期长

为什么当borrow 变量发生变化时,borrow 变量不会改变?