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