繁体   English   中英

如何使用反引号在 node.js 中编写多行 MySQL 查询?

[英]How to write multiline MySQL queries in node.js using backticks?

我在尝试在我的 node.js 应用程序中编写 MySQL 查询时遇到问题。 在编写大型查询时,我需要将代码拆分成多行,因此我需要使用反引号编写一个 JavaScript 字符串。 重点是在我的 MySQL 查询中我还需要使用反引号作为查询的一部分,如下所示:

SELECT `password` FROM `Users`

所以在 node.js 中执行查询的代码应该是这样的:

database.query(`
  SELECT `password` 
  FROM `Users`
`);

但代码不起作用,因为查询的反引号被解释为字符串文字的反引号。 我可以像这样使用单引号或双引号连接几个字符串文字:

database.query( 
  'SELECT `password` ' +
  'FROM `Users`'
);

但我试过了,它很快就变得一团糟。 我还尝试使用一种不同的方法,使用特殊的字符作为反引号替换,并将其替换为带有replaceAll() function 的反引号,如下所示(受 MSSQL 启发):

`SELECT [password]
FROM [Users]`.replaceAll('[', '`').replaceAll(']', '`');

所以我的问题是:有没有一种方法可以编写多行 MySQL 查询,而无需 escaping 查询反引号或不连接多个单引号或双引号字符串文字?

我宁愿不在我的 MySQL 查询中使用反引号。 如果您仍然需要在表名周围加上引号,您可以尝试设置 ANSI_QUOTES 以允许使用" instaead: https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_ansi_quotes

如果这不起作用,您可能更愿意转义反引号: ES6 中带有嵌套反引号 (`) 的模板文字

我尽量避免在查询中使用反引号。 它不是 ANSI SQL,它乱扔代码并且在 99.9% 的情况下不需要它们。 即使您使用一些关键字作为列名,在大多数情况下它也能正常工作,尽管在 IDE 中颜色不同。

如果我必须使用它们,我会用反斜杠转义它们,在极少数情况下需要反斜杠,这还不错。

最后,如果你真的不想使用字符串文字,

const sql = [
 "SELECT *",
 "FROM mytable",
 "WHERE x=0"
].join("\n");

仍然工作得很好。

您可以使用不同的字符(查询中其他地方未使用的字符),然后用反引号替换它。 例如, #

const query = `
SELECT #password#
FROM #Users#
`
  .replaceAll('#', '`')

另一种选择是从文本文件(不是JavaScript 语法)导入查询,并以某种方式导入它:

password-query.txt:

SELECT `password` 
FROM `Users`
const query = fs.readFileSync('./password-query.txt', 'utf-8');
// ...
database.query(query)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM