【问题标题】:Query not working with SQL Template Strings npm查询不适用于 SQL 模板字符串 npm
【发布时间】:2020-02-21 05:52:03
【问题描述】:

我正在尝试使用 sql 模板字符串 npm 包在我的 SQL 查询中安全地使用模板文字,但我不断收到错误消息,指出 sql 语法存在问题。当我省略“SQL”位时,一切正常。我已经安装了 sql-template-strings 包。我错过了什么?感谢您的帮助!

// Import MySQL connection.
const connection = require("../config/connection.js");
let SQL = require('sql-template-strings');
//SQL queries
let orm = {    
    all: (table, cb) => {
        var queryString = SQL`SELECT * FROM ${table}`;    
        connection.query(queryString, (err, result) => {
            if(err) throw err;
            return cb(result);
        })
    }    
  };
module.exports = orm;

我得到的错误:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“阅读”附近使用正确的语法

Reading 是表的名称。

Console.logging queryString 呈现:

$ SQLStatement { 字符串:[ 'SELECT * FROM ', '' ],值:[ 'reading' ] }

还有省略SQL关键字的日志:

$ SELECT * FROM 阅读

我通读了所有文档here

【问题讨论】:

  • 你使用什么 npm 库来访问数据库?

标签: javascript mysql node.js npm template-strings


【解决方案1】:

当您使用sql-template-strings 时,插入到查询中的值将作为参数传递给查询,而不是直接插入到查询中。但是查询中的表名必须静态声明,它们不能作为参数传递。这就是您的查询失败的原因。要使其工作,请将表名直接插入到查询字符串中,而不是使用 SQL 模板字符串插值。

    var queryString = 'SELECT * FROM ' + table;    
    connection.query(queryString, (err, result) => {
        if(err) throw err;
        return cb(result);
    })

这样做的一个重要结果是,如果您不确定变量实际包含什么,那么直接将内容附加到您的 SQL 查询中是非常危险,因此请务必确保table 实际上是一个有效的表名,如果变量包含用户输入,从不这样做。

【讨论】:

    【解决方案2】:

    有一种方法可以通过模板字符串库使用append()

    let queryString = SQL`SELECT * FROM `;
    queryString.append(table); //put variable names into append
    
    connection.query(queryString, (err, result) => {
      if(err) throw err;
      return cb(result);
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      相关资源
      最近更新 更多