node.js - Sequelize 列 Table.createdAt 不存在

标签 node.js sequelize.js

我有这两个表:

const AdminUser = sequelize.define('AdminUser', {
    adminUserId: {
      type: DataTypes.UUID,
      defaultValue: DataTypes.UUIDV4, 
      unique: true, 
      allowNull: false,
      primaryKey: true
    },
    adminUsername: {
      type: 'citext',
      unique: true,
      allowNull: false
    },
    password: {
      type: DataTypes.STRING,
      allowNull: false
    },
    role: {
      type: DataTypes.ENUM,
      values: ['super-admin', 'non-super-admin']  
    },
    active: {
      type: DataTypes.BOOLEAN
    }
  })

AdminUser.belongsToMany(MsTeam, {
      through: 'AdminUserTeam',
      foreignKey: {
        name: 'adminUserId',
        allowNull: false
      }
    })


const MsTeam = sequelize.define('MsTeam', {
    teamId: {
      type: DataTypes.UUID,
      defaultValue: DataTypes.UUIDV4, 
      unique: true, 
      allowNull: false,
      primaryKey: true
    },
    msTeamId: {
      type: DataTypes.STRING,
      unique: true,
      allowNull: false
    },
    msTeamName: {
      type: DataTypes.STRING,
      allowNull: false
    },
    active: {
      type: DataTypes.BOOLEAN
    }
  })

MsTeam.belongsToMany(models.AdminUser, {
      through: 'AdminUserTeam',
      foreignKey: {
        name: 'teamId',
        allowNull: false
      }
    })

他们通过“AdminUserTeam”建立了 n:m 关系。
时间戳已启用。

但是一个简单的查询,例如,
// Include team data
  const includeMsTeam = {
    model: MsTeam,
    through: {
      attributes: []
    },
    attributes: ['teamId', 'msTeamName']
  }
const users = await AdminUser.findAll({
    attributes: ['adminUserId', 'adminUsername'],
    limit: 10,
    offset: 10,
    order: [['createdAt', 'DESC']],
    include: [includeMsTeam]
  })

因错误而失败,
{
    "error": "column AdminUser.createdAt does not exist"
}

奇怪的是,如果我删除 include 字段,查询就会成功

对此的解决方案是禁用提到的时间戳 in this SO answer 。但是如果我想保留时间戳怎么办?如何使用关联按“createdAt”排序?

编辑:添加 SQL 查询
Executing (default): SELECT "AdminUser".*, "MsTeams"."teamId" AS "MsTeams.teamId", "MsTeams"."msTeamName" AS "MsTeams.msTeamName", "MsTeams->AdminUserTeam"."createdAt" AS "MsTeams.AdminUserTeam.createdAt", "MsTeams->AdminUserTeam"."updatedAt" AS "MsTeams.AdminUserTeam.updatedAt", "MsTeams->AdminUserTeam"."adminUserId" AS "MsTeams.AdminUserTeam.adminUserId", "MsTeams->AdminUserTeam"."teamId" AS "MsTeams.AdminUserTeam.teamId" FROM (SELECT "AdminUser"."adminUserId", "AdminUser"."adminUsername" FROM "AdminUsers" AS "AdminUser" WHERE "AdminUser"."role" = 'non-super-admin' AND ( SELECT "AdminUserTeam"."adminUserId" FROM "AdminUserTeam" AS "AdminUserTeam" INNER JOIN "MsTeams" AS "MsTeam" ON "AdminUserTeam"."teamId" = "MsTeam"."teamId" WHERE ("AdminUser"."adminUserId" = "AdminUserTeam"."adminUserId") LIMIT 1 ) IS NOT NULL ORDER BY "AdminUser"."createdAt" DESC LIMIT 20 OFFSET 0) AS "AdminUser" LEFT OUTER JOIN ( "AdminUserTeam" AS "MsTeams->AdminUserTeam" INNER JOIN "MsTeams" AS "MsTeams" ON "MsTeams"."teamId" = "MsTeams->AdminUserTeam"."teamId") ON "AdminUser"."adminUserId" = "MsTeams->AdminUserTeam"."adminUserId" ORDER BY "AdminUser"."createdAt" DESC;

错误发生在,
ORDER BY "AdminUser"."createdAt" DESC

最佳答案

似乎 sequelize 生成了很多子查询,并且 createdAt 对最顶层的 ORDER BY 不可见,请尝试将 subQuery: false 添加到选项对象。如果这没有帮助,将 createdAt 添加到 attributes 应该可以工作。

关于node.js - Sequelize 列 Table.createdAt 不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52915480/

相关文章:

node.js - 为什么 concat-stream 不能与 process.stdin.pipe() 一起工作?

javascript - MongoDb - 使用deleteOne时我需要第二个字段的索引吗

javascript - Sequelize 不使用读取复制

javascript - 如何创建一个 Sequelize 模型实例,而不将其保存在数据库中?

node.js - sequelize - 连接池大小

node.js - 基于 Node+react js 的企业级应用程序的最佳架构是什么?

node.js - 使用 SSL 通过 nginx 代理 websocket 时出现混合内容错误

node.js - 如何部署 Node.js 应用程序而不导致停机

mysql - 未处理的拒绝 SequelizeDatabaseError : Foreign Key constraint error : cannot add foreign key

javascript - 删除 Sequelize 迁移中的约束