Nodejs Mysql:查询转义添加单引号

时间:2019-07-25 09:40:38

标签: mysql sql node.js escaping

我正在尝试转义我的SQL创建表查询。它会在查询中添加单引号,从而导致错误。

ag -z -i "term"

我得到的错误是:

  

“您的SQL语法有误;请查看   对应于您的MySQL服务器版本以使用正确的语法   靠近“ SomeTable_Users”(ID_Charge int AUTO_INCREMENT主键,   ID_Maschine int'在第1行“,

如果表名用单引号引起来,为什么会出现错误?

1 个答案:

答案 0 :(得分:1)

问题在于,它是作为“值”而不是“标识符”进行转义的。根据您用于查询的程序包,可以标记应将其转义为标识符。如果您使用的是mysql软件包,则可以执行以下操作:

let table = "SomeTable";
let query_table = 
"CREATE TABLE IF NOT EXISTS ?? (ID_Charge int AUTO_INCREMENT PRIMARY KEY, ID_Machine int, FOREIGN KEY (ID_Maschine) REFERENCES Machine (ID_Machine))";

con.query(query_table, [`${table}_Users`], (err) => {
(...)

请注意,双??的意思是“这是一个标识符,而不是值”。

如果使用@databases/mysql作为驱动程序,则可以执行以下操作:

con.query(sql`
  CREATE TABLE IF NOT EXISTS ${sql.ident(`${table}_Users`)}
  (
    ID_Charge int AUTO_INCREMENT PRIMARY KEY,
    ID_Machine int,
    FOREIGN KEY (ID_Maschine) REFERENCES Machine (ID_Machine)
  )`
);

请参见https://www.atdatabases.org/docs/sql#sqlidentnames

根据使用库的方式,您可能还希望将允许的表名列入白名单,例如:

if (!['table1', 'table2'].includes(table)) throw new Error('Invalid table name');

您可能还需要使用

`${table}_Users`.toLowerCase();

取决于数据库中区分大小写的方式。