【问题标题】:SequelizeJS Order by renamed attributeSequelizeJS 按重命名属性排序
【发布时间】:2018-06-23 11:24:41
【问题描述】:

我遇到了一个异常,在任何地方都找不到解决方案。貌似是sequelizeJs的bug。

问题来了:

我有两个模型

module.exports = db.sequelize.define('user', {
  // id is added automatically
  createdAt: {
    type: Sequelize.DATE,
    field: 'created_at'
  }
})

module.exports = db.sequelize.define('question', {
  // id is added automatically
  userId: {
    type: Sequelize.BIGINT,
    field: 'user_id'
  }
})

User.hasMany(Question,{foreignKey:'userId',as:'questions'})

然后我有一个问题:

  models.User.findAll({
      limit:limit,
      order:[['createdAt','DESC']],
      include : [{
      {
        model:models.Question,
        as:"questions"
      },]
    })

我收到一个异常提示:“SequelizeDatabaseError: Unknown column 'user.created_at' in 'order Clause'”

这里是生成的sql代码:

SELECT ***** FROM (SELECT user.id, user.created_at AS createdAt FROM user AS user ORDER BY user.@987654331 @ DESC LIMIT 10) AS user LEFT OUTER JOIN question AS questions ON user.id = questions.user_id ORDER BY user.@98 @ DESC

似乎 order by 应用了两次。第二次,“created_at”已重命名为“createdAt”。这就是 db 抱怨“找不到 user.created_at”的原因。

我的问题是如何解决这个问题,以便我可以运行我的查询。我找不到任何可用的解决方案。为什么 Sequelize 两次应用“order by”?看起来没有必要。

【问题讨论】:

    标签: orm sequelize.js


    【解决方案1】:

    sequelize 没有问题,

    以下代码中的问题:包含块内有一个额外的{,请先删除它

    models.User.findAll({
        limit:limit,
        order:[['createdAt','DESC']],
        include : [{
        {
            model:models.Question,
            as:"questions"
        },]
    })
    

    查询是 100% 正确的,我已经执行了相同的方式,并且它从两边(sequelize 和 sql)都可以正常工作。

    您可能遇到的问题是:

    1. 您的用户表必须有名为created_atcreatedAt 字段
    2. models.User.findAll() 中,您可能使用过attributes 和 忘记加created_at

    尝试在你的 sql 中运行查询,并检查错误

    SELECT ***** FROM (SELECT user.id, user.created_at AS createdAt FROM user AS user ORDER BY user.created_at DESC LIMIT 10) AS user LEFT OUTER JOIN question AS questions ON user.id = questions.user_id ORDER BY user.created_at DESC

    你会弄清楚查询有什么问题

    【讨论】:

    • 是的,不需要“{”。但它仍然对我不起作用,你能发布你的代码吗?
    • 代码和你的一样,请提供完整的模型代码和sequlize查询,不要删除任何代码。
    • @DennisHuang,请直接将 sql 查询打到您的数据库中并发布错误,这将非常有帮助。
    【解决方案2】:

    这似乎是一个悬而未决的问题

    See GitHub

    但是,您可以尝试在两个模型上明确说明要查询的属性。

    【讨论】:

    • 你能解释一下怎么做吗?即使我明确说明了属性,它也没有改变任何东西,对吗?所有字段仍将重命名为 Model 属性,这意味着 create_at 也将重命名为 createdAt。 'Order by user.created_at' 仍然会给出异常:“'order Clause' 中的未知列 'question.created_at'”
    • 关键是为什么order by在生成的sql中应用了两次。第二个显然是不必要的。如果我们能把外面的“order by”去掉,问题就解决了。
    猜你喜欢
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多