【问题标题】:Typeorm getManager().query() works only if pass hardcoded SQL query string not variablesTypeorm getManager().query() 仅在传递硬编码的 SQL 查询字符串而不是变量时才有效
【发布时间】:2020-12-21 21:08:54
【问题描述】:

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

  1. 来自 MySqlWorkbench 屏幕截图 https://prnt.sc/uad3tu 和代码 sn-p 的工作示例。如果我将其复制并粘贴到代码中,它就可以正常工作
    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


    【解决方案1】:

    使用查询方法时使用底层driver escaping mechanism。对于mysql:

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

    【讨论】:

    • @АлександрНаумкин 感谢您的反馈,很高兴为您提供帮助
    【解决方案2】:

    最终代码如下:

    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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-17
      • 2012-06-05
      • 1970-01-01
      • 1970-01-01
      • 2022-07-15
      • 2011-09-05
      相关资源
      最近更新 更多