Knex 没有正确转义原始 postgres 查询
Knex not properly escaping raw postgres queries
我正在使用 Knex(带有打字稿)来尝试查询 postgres 数据库。我的数据库 table products
有一个列 name
,当用户在搜索框中键入内容时,我想搜索该列。例如,仅查询字母 'p' 应该 return 名称中包含以 'p' 开头的单词的所有产品。为此,我使用了 ts_vector
和 ts_query
函数。我的查询如下所示:
const query = ... // got from user input
const result = await knex(knex.raw('products'))
.whereRaw(`to_tsvector(name) @@ to_tsquery('?:*')`, query)
.select('*')
当我运行这个查询时,我得到以下错误:
Unhandled error { error: select * from products where to_tsvector(name) @@ to_tsquery(':*') - bind message supplies 1 parameters, but prepared statement "" requires 0
如果我将 whereRaw
行替换为:.whereRaw(`to_tsvector(name) @@ to_tsquery('p:*')`)
,它会正确 运行 查询,选择名称包含以 P 开头的单词的产品。
postgres 语法和 knex 的原始查询似乎有一些冲突。我想使用原始查询而不是使用 `${query}:*`
,因为我希望我的输入被清理并防止 SQL 注入。我怎样才能让 Knex 正确地逃避这个?
我尝试了引号、斜杠和冒号的各种组合,但 none 似乎有效。任何帮助将不胜感激。
PostgreSQL 不处理引号内的占位符(我有点惊讶 knex 会处理)。
您需要在 PostgreSQL 中明确地进行连接:
.whereRaw(`to_tsvector(name) @@ to_tsquery(? ||':*')`,query)
或打字稿内:
.whereRaw(`to_tsvector(name) @@ to_tsquery(?)`, query+":*")
我正在使用 Knex(带有打字稿)来尝试查询 postgres 数据库。我的数据库 table products
有一个列 name
,当用户在搜索框中键入内容时,我想搜索该列。例如,仅查询字母 'p' 应该 return 名称中包含以 'p' 开头的单词的所有产品。为此,我使用了 ts_vector
和 ts_query
函数。我的查询如下所示:
const query = ... // got from user input
const result = await knex(knex.raw('products'))
.whereRaw(`to_tsvector(name) @@ to_tsquery('?:*')`, query)
.select('*')
当我运行这个查询时,我得到以下错误:
Unhandled error { error: select * from products where to_tsvector(name) @@ to_tsquery(':*') - bind message supplies 1 parameters, but prepared statement "" requires 0
如果我将 whereRaw
行替换为:.whereRaw(`to_tsvector(name) @@ to_tsquery('p:*')`)
,它会正确 运行 查询,选择名称包含以 P 开头的单词的产品。
postgres 语法和 knex 的原始查询似乎有一些冲突。我想使用原始查询而不是使用 `${query}:*`
,因为我希望我的输入被清理并防止 SQL 注入。我怎样才能让 Knex 正确地逃避这个?
我尝试了引号、斜杠和冒号的各种组合,但 none 似乎有效。任何帮助将不胜感激。
PostgreSQL 不处理引号内的占位符(我有点惊讶 knex 会处理)。
您需要在 PostgreSQL 中明确地进行连接:
.whereRaw(`to_tsvector(name) @@ to_tsquery(? ||':*')`,query)
或打字稿内:
.whereRaw(`to_tsvector(name) @@ to_tsquery(?)`, query+":*")