Typeorm getManagerquery仅在传递硬编码的SQL查询字符串而不是变量时有效

问题描述

我尝试使用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`.`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

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

解决方法

使用查询方法时,请使用基础的driver escaping mechanism。对于mysql:

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

最终代码如下:

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.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 >= ?',online,mobility,end_at])
}
return events
}