【问题标题】:named parameter binding with sql-wildcard not working使用 sql-wildcard 的命名参数绑定不起作用
【发布时间】:2015-09-16 10:04:45
【问题描述】:

我正在使用 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));
      }
}); 

err 的输出是这样的:

{ [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 试图在作为第一个参数传递给Statement#all 的对象中找到一个名为$name% 的变量或类似的东西。
我搜索了API doc 以获得更多关于此的提示,但找不到任何提示。

我需要逃避什么吗?如何让我的查询使用命名绑定和 sql 通配符 %

【问题讨论】:

    标签: node.js sqlite


    【解决方案1】:

    这不是绑定的工作方式。

    你可以拥有

    SELECT * FROM Clients where name LIKE $name
    

    var name = "%"+"test"+"%";
    ..
    { $name: name }
    

    绑定变量作为“整体”变量与后端数据库协商,您不应将此与变量替换混淆。

    你还应该能够使用 sqlite 的连接功能(未测试):

    SELECT * FROM Clients where name LIKE '%'||$name||'%'
    ..
    { $name: test }
    

    【讨论】:

    • sqlite concat 版本对我来说似乎是最好的,并且有效。谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    相关资源
    最近更新 更多