Javascript 如何在sequelize中转义“$like”通配符“%”和“\`”?

Javascript 如何在sequelize中转义“$like”通配符“%”和“\`”?,javascript,sqlite,sequelize.js,Javascript,Sqlite,Sequelize.js,如何告诉sequelize(使用sqlite3)在$like子句中转义通配符(%,) 例如,我想生成一个与下面的查询类似的查询,该查询在任何“things.description”(而不仅仅是被任何字符包围的单词“cool”)中查找文本字符串\u cool: 从描述中选择*,如“\\u cool\\u ESCAPE”\; 我猜它看起来是这样的,但结果查询并不是我所希望的: Thing.findAll({ 其中:{ 说明:{ $like:['?',''u cool'], //……或者。。。 $l

如何告诉sequelize(使用sqlite3)在
$like
子句中转义通配符(
%

例如,我想生成一个与下面的查询类似的查询,该查询在任何“things.description”(而不仅仅是被任何字符包围的单词“cool”)中查找文本字符串
\u cool

从描述中选择*,如“\\u cool\\u ESCAPE”\;
我猜它看起来是这样的,但结果查询并不是我所希望的:

Thing.findAll({
其中:{
说明:{
$like:['?',''u cool'],
//……或者。。。
$like:'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\,
$escape:“\\”,
}
}
});
//=>正在执行(默认):
//选择'id','description`
//从‘Things’变成‘Things’`
//哪里有'Thing'。'description'LIKE'?','u cool';
不幸的是,我不能进入原始查询,因为“LIKE”子句将是更大的动态查询的一部分


有什么想法吗?

我唯一想到的是

description: {
    $like: sequelize.literal(`'\\_cool\\_' ESCAPE '\\'`)
}
这会生成类似SQL的

LIKE '\_cool\_' ESCAPE '\'

基于@piotrbienias的完整解决方案,可接受任何用户输入并正确转义-

if (typeof query.string !== 'string') {
    throw Error('expecting string')
}
const inputRaw = query.string.replace(/(_|%|\\)/g, '\\$1');
const inputSec = sequelize.escape(`%${inputRaw}%`);
description = {
    $like: sequelize.literal(`${inputSec} ESCAPE '\\'`)
};
对于示例字符串
\u cool\u
,这将转换为-

LIKE '%\\_cool\\_%' ESCAPE '\\'
您可以根据实际用例更改逻辑以添加其他通配符


如果您使用的是mysql而不是sqlite,默认转义无论如何都是
\
,因此可以删除转义声明

如果您转义的是单个反斜杠,那么这不是
\\\\\\\\\\\
吗?@Xorifelse在JavaScript中,字符串文字
“\\\\\\\\\\\\\\\
等于字符串
“\\\\\”
。看来这可能只是sequelize当前的一个缺点好主意,只需要小心转义目标值本身,以避免SQL注入。sequelize提供了一种方法,可用于转义值以避免注入