柴油查询中的“听起来像”
Posted
技术标签:
【中文标题】柴油查询中的“听起来像”【英文标题】:"SOUNDS LIKE" in diesel query 【发布时间】:2021-05-10 00:00:33 【问题描述】:我想使用 mysql 的“SOUNDS LIKE”查询一个字段。
SQL:
WHERE field SOUNDS LIKE "blah"
如何用柴油框架查询这个?
我想到了
.filter(sql("field SOUNDS LIKE ???"))
但是如何通过正确的转义在这里注入 (bind()
) 我的值?
或者有没有更好的方法来使用不受支持的 SQL 进行过滤?
EDIT1:
我找到了 infix_operator 宏,但它不起作用。找不到SqlType
、TypedExpressionType
和 infix_operator 宏。但根据 Github,它就在那里:
use diesel::sql_types::SqlType;
use diesel::expression::TypedExpressionType;
use diesel::expression::AsExpression;
use diesel::expression::Expression;
diesel::infix_operator!(SoundsLike, " SOUNDS LIKE ");
fn sounds_like<T, U, ST>(left: T, right: U) -> SoundsLike<T, U::Expression>
where
T: Expression<SqlType = ST>,
U: AsExpression<ST>,
ST: SqlType + TypedExpressionType,
SoundsLike::new(left, right.as_expression())
【问题讨论】:
.filter(sql("field SOUNDS LIKE 'blah'"))
?
该值来自用户输入(=变量)。认为这很明显:-)
【参考方案1】:
我找到了 infix_operator 宏,但它不起作用。未找到 SqlType、TypedExpressionType 和 infix_operator 宏。但根据 Github,它就在那里:
这是因为您查看了 master 分支,其中包含未发布的更改。其中之一是将 diesel::infix_operator!
从 diesel_infix_operator!
重命名
通过使用最新版本的变体,您的代码应该可以正常工作:
#[macro_use] extern crate diesel;
use diesel::expression::AsExpression;
use diesel::expression::Expression;
diesel_infix_operator!(SoundsLike, " SOUNDS LIKE ");
fn sounds_like<T, U, ST>(left: T, right: U) -> SoundsLike<T, U::Expression>
where
T: Expression<SqlType = ST>,
U: AsExpression<ST>,
SoundsLike::new(left, right.as_expression())
【讨论】:
仍然找不到SqlType和TypedExpressionType。使用柴油 1.4.5。 AsExpression 和 Expression 都可以。 没错,我错过了。代码现已修复,应该可以在 1.4.5 版本中正常工作。【参考方案2】:您可以使用bind
方法绑定参数:
table.filter(sql("SOUNDS LIKE ").bind::<Text, _>(input);
【讨论】:
没有那么优雅,因为我必须对表和字段名称进行硬编码。但它有效。谢谢以上是关于柴油查询中的“听起来像”的主要内容,如果未能解决你的问题,请参考以下文章