我正在尝试转义我的SQL创建表查询。它会在查询中添加单引号,从而导致错误。
ag -z -i "term"
我得到的错误是:
“您的SQL语法有误;请查看 对应于您的MySQL服务器版本以使用正确的语法 靠近“ SomeTable_Users”(ID_Charge int AUTO_INCREMENT主键, ID_Maschine int'在第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();
取决于数据库中区分大小写的方式。