无法在 postgres 插入中插入问号

Ash*_*osh 4 postgresql node.js knex.js

我正在尝试运行一个简单的 Postgres SQL 插入:

insert into "Resources" values(1, 'How are you?');
Run Code Online (Sandbox Code Playgroud)

但是插入后的结果是:

ID        Data
---       ------
1         How are you$1
Run Code Online (Sandbox Code Playgroud)

我知道,要插入像单引号这样的字符,我必须用另一个单引号将其转义,例如:我不能这样做。

但是怎么办呢?

Dan*_*den 6

Knex 将?和解释??为位置绑定。您通常会在knex.raw()语句中使用它们来安全地注入某种变量。例如:

knex.raw('UPDATE my_table SET my_column = ?', [someVariable])
Run Code Online (Sandbox Code Playgroud)

像这样的绑定参数对于原始语句通常是必要的,以确保您注入的任何内容都被安全地转义。

所以这就是你看到这种行为的原因。好消息是,你可以避开问号。从Knex.js 文档

防止更换?可以使用转义序列\\?。

  • @vitaly-t 它不需要额外的转义。您不应该将值作为常量字符串传递给像 knex.raw(`select * from table where name = 'who are you?'`) 这样的驱动程序,但正如这个答案所述,您应该这样做 knex.raw(`select * from table where name = 'who are you?'`) name = ?`, ['who are you?']) 将值作为值绑定传递给数据库驱动程序。这只是因为 knex 无法实现 SQL 解析器来知道哪些部分是值,哪些部分不是值。 (2认同)