【问题标题】:Convert mySQL query to KNEX将 mySQL 查询转换为 KNEX
【发布时间】:2020-02-19 17:51:18
【问题描述】:

我正在将一系列查询转换为 Knex 语法。 我对这个查询有疑问:

SELECT id,reviewed,log_reference,CONVERT(notification USING utf8),create_time,update_time,store,user_id
FROM store_failure_log
WHERE reviewed = 0
AND create_time BETWEEN NOW() - INTERVAL 18 HOUR AND NOW();

更准确地说是这一行:

SELECT id,reviewed,log_reference,CONVERT(notification USING utf8),create_time,update_time,store,user_id

我有这个 Knex:

knex('store_failure_log')
        .select('id', 'reviewed', 'log_reference', 'CONVERT(notification USING utf8)', 'create_time', 'update_time', 'store', 'user_id').convert('notification USING utf8')
        .where('reviewed', 0)
        .where(knex.raw('create_time BETWEEN NOW() - INTERVAL 18 HOUR AND NOW()'))

产生这个 sql 查询:

select `id`, `reviewed`, `log_reference`, `CONVERT(notification USING utf8)`, `create_time`, `update_time`, `store`, `user_id` from `store_failure_log` where `reviewed` = 0 and create_time BETWEEN NOW() - INTERVAL 18 HOUR AND NOW()

问题出在:转换(使用 utf8 的通知)。

查询无效,因为转换在括号中。用knex怎么写?

一般而言,如何在 KNEX 语法中包含 SQL 函数调用?

【问题讨论】:

  • 不是直接答案,但如何在连接字符串中指定 UTF8,然后在查询中跳过 CONVERT
  • 这是可能的解决方案。但我想更好地掌握 Knex,尤其是如何使用 SQL 函数调用。

标签: mysql node.js knex.js


【解决方案1】:

您可以使用 raw 在您的 Knex 查询中包含 SQL 函数调用,就像您在 where 中所做的那样:

knex('store_failure_log')
        .select(knex.raw('id, reviewed, log_reference, CONVERT(notification USING utf8), create_time, update_time, store, user_id'))
        .where('reviewed', 0)
        .where(knex.raw('create_time BETWEEN NOW() - INTERVAL 18 HOUR AND NOW()'))

【讨论】:

  • 你的.select(knex.raw('id', 'reviewed', 'log_reference', 'CONVERT(notification USING utf8)', 'create_time', 'update_time', 'store', 'user_id')) 语法错误,会抛出错误。
  • 你说得对,我已经通过删除不必要的引号来纠正它。
【解决方案2】:

这是@Veve 答案的固定版本,正确引用了标识符和 knex.raw 语法:

knex('store_failure_log')
        .select('id', 'reviewed', 'log_reference', knex.raw('CONVERT(?? USING utf8)', ['notification']), 'create_time', 'update_time', 'store', 'user_id')
        .where('reviewed', 0)
        .where(knex.raw('?? BETWEEN NOW() - INTERVAL 18 HOUR AND NOW()', ['create_time']))

https://runkit.com/embed/lh2i1qif7obx

【讨论】:

    猜你喜欢
    • 2023-01-11
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 2018-11-01
    • 2013-07-10
    • 2018-03-13
    相关资源
    最近更新 更多