【发布时间】:2020-08-28 21:47:36
【问题描述】:
问题描述
使用 SubQuery 向 Sequelize Query 添加限制无法限制检索。引用此错误的多个在线资源并且没有解决方案。这是 Sequelize 错误还是用户错误?
你在做什么?
ThreadFolderUser.findAll({
order: [
['updated_at', 'DESC']
],
where: {
user_id,
folder_id,
deleted,
archived,
},
distinct: true,
offset,
limit: 10,
include: [
{
model: Thread,
include: [
{ model: Email, include: [Attachment] },
]
}
],
})
协会
// ThreadFolderUser (assoc table) - Thread / Folder / User (tables)
User.hasMany(ThreadFolderUser, { foreignKey: 'user_id' })
ThreadFolderUser.belongsTo(User, { foreignKey: 'user_id' })
Folder.hasMany(ThreadFolderUser, { foreignKey: 'folder_id' })
ThreadFolderUser.belongsTo(Folder, { foreignKey: 'folder_id' })
Thread.hasMany(ThreadFolderUser, { foreignKey: 'thread_id' })
ThreadFolderUser.belongsTo(Thread, { foreignKey: 'thread_id' })
// Thread - Emails
Thread.hasMany(Email, { foreignKey: 'thread_id' })
Email.belongsTo(Thread, { foreignKey: 'thread_id' })
// Email - Attachments
Email.hasMany(Attachment, { foreignKey: 'email_id' })
Attachment.belongsTo(Email, { foreignKey: 'email_id' })
您预计会发生什么?
我预计从 AssociationTable 中检索到 10 条记录(基于当前设置为 10 条的限制),因为我在数据库中至少有 15 条记录与此查询匹配。
实际发生了什么?
在我的情况下返回 6,而不是 10(限制设置为 10)。而不是拉前 10 场比赛。
附加上下文
如果我删除 限制,它会按预期工作(即使包含包含)。
如果我删除 include,它会按预期工作(即使有限制)。
如果我复制/粘贴 Sequelize 生成的 SQL 查询并将其直接插入 Workbench,它会检索适当数量的行。
问题似乎是 limit 结合 include 导致查询仅检索在数据库中搜索的前 10 个匹配的记录。
对同一问题的其他参考,但未提供适当的解决方案:
环境
- 续集版本:v5.21.3
- Node.js 版本:v12.13.1
- 操作系统:AWS Lambda 函数
- TypeScript 版本:3.7.2
我很清楚,这个完全相同的问题已在多个其他线程和平台中提出——正如我在上面链接了其中的一些——但是它们都没有直接的答案,其中 1 个被标记一个无关紧要的点作为没有解决预期问题的答案。我希望我们能得到这个问题的答案,或者除了硬编码 SQL 查询(最后的手段)之外的现实解决方法。
如果 Sequelize 无法在同一个查询中处理包含包含的限制,那将是不可想象的,因此我这边一定有一些缺失/用户错误。我已经搜索了多次,并且肯定是从 Sequelize 文档开始的,其中没有引用这个问题或类似的例子,或者结合限制和包含可能出现的任何问题。
非常感谢您为帮助解决此问题所做的任何贡献。希望有一些@Sequelize 工程师能够帮助回答这个问题:)
【问题讨论】:
-
显示关联定义
-
@Anatoly - 谢谢,添加了他们。
-
AssociationModel 的关联在哪里?
-
@Anatoly 已更新 - 我试图使用通用名称来保持简单,但在添加需要更新的关联时忘记了。
标签: mysql node.js sequelize.js serverless-framework