在 pg-promise 查询中使用 $1 比模板文字有好处吗?

Mat*_*ber 2 postgresql pg-promise

使用pg-promise,使用$1模板文字有什么好处吗?模板文字对我来说更熟悉,但我必须假设他们由于这个包的原因而以不同的方式做。

“正常”方式:

db.any('SELECT * FROM users WHERE active = $1', [true])
Run Code Online (Sandbox Code Playgroud)

我这样做的方式:

const isTrue = true;

db.any(`SELECT * FROM users WHERE active = ${isTrue}`)
Run Code Online (Sandbox Code Playgroud)

更新了我的做法:

const isTrue = true;
const name = 'Matt'
db.any('SELECT * FROM users WHERE active = $1 AND name = $2', [isTrue, name])
Run Code Online (Sandbox Code Playgroud)

或者

const isTrue = true;
const name = 'Matt'
db.any(`SELECT * FROM users WHERE active = $/isTrue/ AND name = $/name/`, {isTrue, name})

Run Code Online (Sandbox Code Playgroud)

vit*_*y-t 6

与模板文字相比,使用 $1 有什么好处吗?

您不能使用模板文字,文档强调

重要提示:切勿在 ES6 模板字符串中使用保留${}语法,因为它们不知道如何格式化 PostgreSQL 的值。在 ES6 模板字符串中,您只能使用 4 个替代项之一 - $()$<>$[]$//

您应该使用命名参数,它们比索引变量有很多好处:

对于您自己的示例,如果您确实需要模板字符串:

const isTrue = true;

await db.any(`SELECT * FROM users WHERE active = $/isTrue/`, {isTrue});
Run Code Online (Sandbox Code Playgroud)

或者您可以只使用标准字符串:

await db.any('SELECT * FROM users WHERE active = ${isTrue}', {isTrue});
Run Code Online (Sandbox Code Playgroud)