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

binding variables to SQL statements using node-sqlite3

我正在尝试转换为:

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 文档中看到的一样。我在每个变量前都尝试过“?”、“@”和“:”,但似乎可以识别 none。 我的代码有什么问题?

绑定参数仅适用于 WHERE 子句中的 values。 Table 和列名(统称为 "identifiers")将不起作用。

"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,所以我会留给你编码。