gpt4 book ai didi

sql - 使用 NodeJS 进行 Sequelize 无法连接有限制的表

转载 作者:IT老高 更新时间:2023-10-28 23:14:43 25 4
gpt4 key购买 nike

我正在尝试实现一个应该如下所示的简单查询:

select * from property join entity_area on property.id=entity_area.entity_id and entity_area.area_id=1 where property.price>300000 limit 12

非常简单:我想获得连接结果,然后限制为 12 个。

在 Sequelize 中,我使用以下函数:

return models.property.findAll(
{
where: ["price>=?", 300000],
include: [
{
model:models.entity_area,
where: { area_id:1 }
}
],
limit:12
})

但是这段代码会生成如下的sql:

select property.*, entity_area.* from (select * from property where property.price>300000 limit 12) join entity_area on property.id=entity_area.entity_id and entity_area.area_id=1

这与我正在尝试做的逻辑完全不同,因为在生成的 sql 中它首先得到任何 12 个结果,然后尝试与 entity_area 连接,当然随机的 12 个结果不一定与 entity_area 匹配,所以我没有得到任何结果。

请给我一个正确的方法。属性表非常庞大,我必须使用“限制”而不是获取所有结果并在 javascript 中对它们进行切片。我也不想开始使用原始查询。

最佳答案

其实我自己也找到了解决办法。我认为这是sequelize框架中的一个错误。
在 node_modules/sequelize/lib/dialect/abstract/query_generator.js 中有一个“selectQuery”函数,它具有以下行:

subQuery = limit && (options.hasIncludeWhere || options.hasIncludeRequired || options.hasMultiAssociation) && options.subQuery !== false

首先有一个选项 subQuery 可以作为 false 传递以删除子查询生成。 Sequelize 文档对此只字未提。但是此外,如果您在 findAll 对象中传递 subQuery:false ,它将无法工作,因为由于某种原因,它对 selectQuery 函数的定义不够完善。
我试过类似的东西:

return models.property.findAll(
{
where: ["price>=?", 300000],
include: [
{
model:models.entity_area,
where: { area_id:1 }
}
],
limit:12,
subQuery:false
})

仍然得到 options.subQuery=undefined。

所以我不得不将 query_generator.js 中的函数更改为:

subQuery = limit && (options.hasIncludeWhere || options.hasIncludeRequired || options.hasMultiAssociation) && options.subQuery !== false && options.doSubQuery===true

所以现在默认情况下它不会执行这个丑陋的子查询,除非我明确指定 doSubQuery:true。最后我得到了正确的查询,没有带限制的子查询。

关于sql - 使用 NodeJS 进行 Sequelize 无法连接有限制的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26021965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com