Knex(с Expressjs) и PostgresSQL: строка автоматически заключается в двойные кавычки в SQL с помощью knex

#post&resql #express #knex.js

#post&resql #экспресс #knex.js

Вопрос:

У меня возникает проблема, когда я пытаюсь передать значение в SQL с помощью knex.

 app.&et('/home/:topbarMenuPath', (req, res)=&&t; {
  const { topbarMenuPath } = req.params;

  var toStrin&Query =
  db.select('tm1.menu_name','tm1.seq','tm1.menu_path','tm1.menu_id')
  .from('tb_menu as tm1')
  .join('tb_menu as tm2', function() {
    this.on('tm1.parent_menu_id', '=', 'tm2.menu_id')
      .andOn('tm2.menu_level', '=', 1)
      .andOn('tm1.menu_level', '=', 2)
      .andOn('tm2.menu_path','=',topbarMenuPath)
  }).toStrin&()
  ;
  console.lo&('toStrin&Query',toStrin&Query);
});
  

Если я передам ‘:topbarMenuPath’ как ‘привет’, консоль.вывод журнала будет показан ниже:

 select "tm1"."menu_name", "tm1"."seq", "tm1"."menu_path", "tm1"."menu_id" 
from "tb_menu" as "tm1" 
inner join "tb_menu" as "tm2" on "tm1"."parent_menu_id" = "tm2"."menu_id" 
and "tm2"."menu_level" = 1
and "tm1"."menu_level" = 2 
and "tm2"."menu_path" = "hello"
  

Кажется, что Post&res не может распознать двойные кавычки «hello», это показывает ошибку, когда я пытаюсь отправить SQL в Post&res.
Ошибка:

 {
    "len&th": 166,
    "name": "error",
    "severity": "ERROR",
    "code": "42703",
    "position": "251",
    "file": "d:\p&installer_12.auto\post&res.windows-x64\src\backend\parser\parse_relation.c",
    "line": "3359",
    "routine": "errorMissin&Column"
}
  

Есть ли какой-либо способ, которым я могу получить SQL с приветствием в одинарных кавычках, как показано ниже?

 and "tm2"."menu_path" = 'hello'
  

вместо

 and "tm2"."menu_path" = "hello"
  

Ответ №1:

Да, из документов:

Если вам нужно использовать буквальное значение (строку, число или логическое значение) в соединении вместо столбца, используйте knex.raw.

 knex.select('*').from('users').join('accounts', 'accounts.type', knex.raw('?', ['admin']))
Outputs:
select * from `users` inner join `accounts` on `accounts`.`type` = 'admin'
  

Для вас это означает .andOn('tm2.menu_path', '=', knex.raw('?', [topbarMenuPath]))