【问题标题】:Convert raw query to sequelize将原始查询转换为续集
【发布时间】:2020-06-17 05:06:54
【问题描述】:

我是 Sequelize 的新手,我很难理解这一点。这是我的原始查询:

select * from routes r join transports t where origin like :origin and destination like :destination and convert(departure, date) like convert(:date, date) and r.transportId = t.id

我想在 Sequelize 中执行此操作,并查看我尝试过的文档:

const { Sequelize, Op } = require("sequelize");
Route.findAll({
            where: {
                destination,
                origin,
                Sequelize.where(Sequelize.fn('CONVERT', Sequelize.col('departure'), 'date'): {
                        [Op.like]: Sequelize.fn('CONVERT', date, 'date'))
                }
            },
           include: [{
                model: db.transport,
                as: 'transport'
            }]);

但我遇到语法错误。

编辑:

Route.findAll({
        where: {
            destination,
            origin,
            Sequelize.where(Sequelize.fn('CONVERT', Sequelize.col('departure'), 'date'), {
                [Op.like]: Sequelize.fn('CONVERT', date, 'date')
            })
        },
        include: [{
            model: db.transport,
            as: 'transport'
        }]
    });

我仍然遇到同样的语法错误:

 Sequelize.where(Sequelize.fn('CONVERT', Sequelize.col('departure'), 'date'), {
          ^

SyntaxError: Unexpected token '.'

编辑:

Route.findAll({
        where: {
            [Op.and]: [
                { destination, origin },
                Sequelize.where(Sequelize.fn('CONVERT', Sequelize.col('departure'), 'date'), {
                    [Op.like]: Sequelize.fn('CONVERT', date, 'date')
                })
            ]
        },
        include: [{
            model: db.transport,
            as: 'transport'
        }]
    });

它消除了之前的语法错误。现在我得到了这个:

SequelizeDatabaseError: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''date') LIKE CONVERT('2020-05-28 00:00:00', 'date'))' at line 1

【问题讨论】:

  • 你能粘贴出现语法错误的错误日志吗?我还建议您不惜一切代价避免基于字符串比较执行 JOIN,并开始基于给定寄存器的 ID 执行它们。
  • @RamiroOlivencia,我想没必要 - 括号中的闭包是明显的问题

标签: javascript sql node.js sequelize.js


【解决方案1】:

格式正确

Sequelize.where(Sequelize.fn('CONVERT', Sequelize.col('departure'), 'date'),
  {
    [Op.like]: Sequelize.fn('CONVERT', 'date', date)
  }
)
where: {
  [Op.and]: [ 
    { destination: {[Op.like]: destination }},
    { origin: {[Op.like]: origin }},
    Sequelize.where(Sequelize.fn('CONVERT', Sequelize.col('departure'), 'date'), 
    {
      [Op.like]: Sequelize.fn('CONVERT', date, 'date')
    })
  ]
}

【讨论】:

  • 你说得对,我的括号有一些错误,但我仍然遇到语法错误。立即查看。
  • @User1,那是另一个错误,和topic无关,是sequelize生成的sql文本错误。检查 CONVERT 语法,可能是您提供的参数错误
  • @User1,我猜你应该交换'日期'和日期
  • 不是这样的。我的原始查询使用转换函数并且工作得很好。它与该主题有关,因为我的问题仍然是我无法将原始查询变成续集查询。谢谢你。
  • @User1,确定吗?因为在文档中类型排在第一位CONVERT(data_type(length), expression, style)
【解决方案2】:

我已经想通了。我终于不得不使用Sequelize.literal 让它工作:

Route.findAll({
        where: {
            [Op.and]: [
                { destination },
                { origin },
                Sequelize.where(Sequelize.literal('CONVERT(departure, date)'), {
                    [Op.like]: Sequelize.literal('CONVERT("' + date + '", date)')
                })
            ]
        },
        include: [{
            model: db.transport,
            as: 'transport'
        }]
    });

【讨论】:

    猜你喜欢
    • 2019-07-19
    • 2015-04-08
    • 2018-09-12
    • 2018-05-23
    • 2015-06-26
    • 1970-01-01
    • 2019-04-29
    • 2015-01-31
    • 2019-02-03
    相关资源
    最近更新 更多