使用node-sqlite3将变量绑定到SQL语句

时间:2015-12-16 04:00:49

标签: javascript node.js syntax binding sqlite

我想转换这个:

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:near" $ table":语法错误

但我不确定这里的语法错误,因为格式就像我在API文档中看到的那样。我曾尝试过',' @'和':'在每个变量之前,但似乎都没有被识别。 我的代码有什么问题?

1 个答案:

答案 0 :(得分: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字符。
  • 将所有“with”替换为“。
  • 用双引号包裹整个东西。

我对Javascript不太满意,所以我会留下你的代码。