Typeorm getManager().query() 仅在传递硬编码 SQL 查询字符串而不是变量时才有效

问题描述 投票:0回答:3

我尝试使用 Typeform 和 getManager().query() 从服务器发出 SQL 请求,并使用 SQL 传递到查询字符串。

  1. 来自 MySqlWorkbench 屏幕截图的工作示例 https://prnt.sc/uad3tu 和代码片段。如果我将其复制并粘贴到代码中,它就可以正常工作
    SELECT `Event`.*, `Repeats`.`start_event_at`, `Repeats`.`end_event_at`
    FROM `events` `Event` 
    LEFT JOIN `event_repeats` `Repeats` on `Repeats`.`eventId` = `Event`.`id`
    WHERE `Event`.`category` = 'fitness' 
    AND `Repeats`.`end_event_at` >= '2020-09-02T14:59:00.000Z'
  1. 但是如果我在插值字符串中使用变量,它会抛出错误,截图https://prnt.sc/uad5zy
    SELECT `Event`.*, `Repeats`.`start_event_at`, `Repeats`.`end_event_at`
    FROM `events` `Event` 
    LEFT JOIN `event_repeats` `Repeats` on `Repeats`.`eventId` = `Event`.`id`
    WHERE `Event`.`category` = ${category} 
    AND `Repeats`.`end_event_at` >= '2020-09-02T14:59:00.000Z'

抛出错误:https://prnt.sc/uad6zs

我做错了什么以及如何管理它?

sql nestjs query-builder typeorm
3个回答
1
投票

使用查询方法时使用底层驱动转义机制。对于 MySQL:

await getEntityManager().query('SELECT * FROM tbl_1 WHERE category = ?', [ 'fitness' ])

0
投票

最终代码如下所示:

async getAllEvents(search_options: any, end_at, offFilters): Promise<Event[]> {

const { isOnline, isMobility, impairment, category } = search_options;

let events = null;
if (offFilters) {
  events = await getManager().query(
      ' SELECT Event.*, Repeats.start_event_at, Repeats.end_event_at ' +
            ' FROM events Event ' +
            ' LEFT JOIN event_repeats Repeats ON Repeats.eventId = Event.id ' +
            ' WHERE Event.category = ? ' +
            ' AND Repeats.end_event_at >= ?', [category, end_at])
} else {
  const online = isOnline ? 1 : 0
  const mobility = isMobility ? 1 : 0

  events = await getManager().query(
            ' SELECT Event.*, Repeats.start_event_at, Repeats.end_event_at ' +
            ' FROM events Event ' +
            ' LEFT JOIN event_repeats Repeats ON Repeats.eventId = Event.id ' +
            ' WHERE Event.category = ? ' +
            ' AND Event.isOnline = ? ' +
            ' AND Event.isMobility = ? ' +
            ' AND Event.impairment = ? ' +
            ' AND Repeats.end_event_at >= ?', [category, online, mobility, impairment, end_at])
}
return events
}

0
投票

添加其他响应,以供将来参考 - 每个驱动程序都有不同的方法来替换变量

  • 甲骨文:
    query('SELECT * FROM table WHERE name = :name', [ { val: 'something' } ])
  • MySQL:
    query('SELECT * FROM table WHERE name = ?', [ 'something' ])
  • MSSQL:
    query('SELECT * FROM table WHERE name = @0', [ 'something' ])
  • Postgres:
    query('SELECT * FROM table WHERE name = $1', [ 'something' ])

来源:https://github.com/typeorm/typeorm/issues/881#issuecomment-1576624514

© www.soinside.com 2019 - 2024. All rights reserved.