我使用node-sqlite3包来访问我的数据库 我尝试使用以下代码从Clients表中获取行:
var st = db.prepare("SELECT * FROM Clients where name LIKE '%$name%'");
st.all({ $name: "test" }, function (err, rows) {
console.log("this: " + JSON.stringify(this));
if (err)
console.log(err);
else {
console.log("found: " + JSON.stringify(rows));
}
});
错误的输出是:
{ [Error: SQLITE_RANGE: bind or column index out of range] errno: 25, code: 'SQLITE_RANGE' }
当我将sql更改为SELECT * FROM Clients where name LIKE '%$name%'
时,查询有效,并且不会抛出错误。所以我想问题是,node-sqlite3
试图在作为第一个参数传递给$name%
的对象中找到一个名为Statement#all
的变量或类似的变量。
我已经在API doc上搜索了有关此内容的更多提示,但无法找到。
我需要逃避什么吗?如何让我的查询使用命名绑定和sql通配符%
?
答案 0 :(得分:2)
这不是绑定的工作方式。
你可以拥有
SELECT * FROM Clients where name LIKE $name
和
var name = "%"+"test"+"%";
..
{ $name: name }
绑定变量与后端数据库相关联,作为"整体"变量,你不应该把它与变量替换混淆。
你还应该能够使用sqlite的连接函数(未测试):
SELECT * FROM Clients where name LIKE '%'||$name||'%'
..
{ $name: test }