【问题标题】:binding variables to SQL statements using node-sqlite3使用 node-sqlite3 将变量绑定到 SQL 语句
【发布时间】:2016-03-22 02:21:48
【问题描述】:

我正在尝试转换:

var query_string = 'SELECT protein_A, protein_B, PIPE_score, site1_A_start FROM ' + organism + PIPE_output_table +
        ' WHERE ' + score_type + ' > ' + cutoff['range'] + ' AND protein_A = "' + item + '" ' +
        'UNION SELECT protein_A, protein_B, PIPE_score, site1_A_start FROM ' + organism + PIPE_output_table +
        ' WHERE ' + score_type + ' > ' + cutoff['range'] + ' AND protein_B = "' + item + '";';

 db.each(query_string, function (err, row) { 
  ...

对此:

var query_string = "SELECT protein_A, protein_B, PIPE_score, site1_A_start FROM $table WHERE $score_type > $score AND protein_A = '$protein'" +
        " UNION SELECT protein_A, protein_B, PIPE_score, site1_A_start FROM $table WHERE $score_type > $score AND protein_A = '$protein'";

    var placeholders = {
        $table: organism + PIPE_output_table,
        $score_type: score_type,
        $score: cutoff['range'],
        $protein: item
    };

    var stmt = db.prepare(query_string, placeholders, function(err) {
        console.log(err);
        stmt.each(function(err,row) {
            ...
        })
    }

但我不断收到此错误: 错误:SQLITE_ERROR:“$table”附近:语法错误

但我不确定这里有什么语法错误,因为格式与我在 API 文档中看到的一样。我在每个变量之前尝试了“?”、“@”和“:”,但似乎没有一个被识别。 我的代码有什么问题?

【问题讨论】:

    标签: javascript node.js syntax binding sqlite


    【解决方案1】:

    绑定参数仅适用于WHERE 子句中的。表名和列名(统称为“标识符”)将不起作用。

    "SELECT foo FROM bar WHERE this = $that"    # OK
    
    "SELECT foo FROM bar WHERE $this = 'that'"  # Not OK
    

    通常,您可以通过转义和引用标识符并将它们插入到查询中来解决此问题。一个好的数据库库对此有一个方法调用...

    var this = db.quote_literal(input_column);
    'SELECT foo FROM bar WHERE ' + this + ' = ?'
    

    不幸的是,node-sqlite3 似乎没有。 :(

    SQLite 确实提供了引用函数 the %w operator,但 node-sqlite3 似乎没有提供它。

    您必须自己编写。按照this answer in Python 的说明将它们转换为 Javascript。

    • 确保字符串可以编码为 UTF-8。
    • 确保字符串不包含任何 NUL 字符。
    • 将所有“”替换为“”。
    • 将整个内容用双引号括起来。

    我不太擅长 Javascript,所以我让你编写代码。

    【讨论】:

    • 哦,我明白了,再次感谢您的帮助 :)
    猜你喜欢
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 2011-06-09
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    相关资源
    最近更新 更多