当前位置: 首页 > 面试题库 >

用NodeJS进行续集无法限制表的连接

关飞翔
2023-03-14
问题内容

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

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

So now by default it’s not doing this ugly subquery unless i specify
explicitely doSubQuery:true. And finally i got the proper query without
subquery with limit.



 类似资料:
  • 我的代码只有在我删除限制函数时才有效,我做错了什么? 错误为: TypeError:批量。查找(…)。limit不是D:\nodeprojects\mysite\server上的函数。js:281:19 at对象。(D:\nodeprojects\mysite\server.js:285:3)位于模块_在对象处编译(module.js:570:32)。模块_扩展。。模块处的js(模块js:579:

  • 问题内容: 我正在尝试新的React Hooks的API,它似乎一直在无限循环中运行!我只希望回调运行一次。这是我的代码供参考: 单击“运行代码段”,以查看将“ Run useEffect”字符串无限打印到控制台。 问题答案: 发生这种情况是因为在每次渲染后都会触发,这是在这种情况下无状态功能组件的调用。当你做一个从返回的呼叫中,阵营将再次呈现该组件,并再次运行。这将导致无限循环: →交通→交通→

  • 我正在通过AWS-EC2上的Binance api从Binance获取OHLCV数据。但有时(几天一次)会出现错误“104,‘EconReset’”,程序停止。 该程序是用Python3.7.3编写的,在AWS-EC2上运行 代码如下。但此代码无法继续。 我想在出现任何api或连接错误时继续运行程序。 我应该如何处理这个错误? 所有错误质量如下所示。 Traceback(最近一次调用最后):Fil

  • 问题内容: 所以,我有一张表,上面有这样的行: 每次扫描警报时(即每次触发或清除警报时)都会添加“已扫描的警报”行。任何警报都会添加带有特定Ev_Custom1的行。第一列Ev_Message包含一个计算机ID,该ID使我可以将警报与其他计算机分开。(您不喜欢任意的列名吗?)超过900条独特的警报消息。 我希望查询返回的内容是这样的: 这将是两个日期之间过滤的查询。我可以更改进入表的数据,但是有9

  • 大家好,我正在尝试匹配以下正则表达式: 最少字符数:8 最大字符数:22 最小大写字母:1 最小小写字母:1 最小位数:2 允许使用特殊字符 第一个字符必须是字母 最大连续相同字符数:2 我已经设法完成了每一个条件,但连续的条件是: 遵循后正则表达式不超过2个相同的连续字符和a-Z和0-9,我发现不匹配精确字符的方法是: 但是我无法混合它们并获得完整的匹配结果。尝试在这里完成:https://re

  • 我最近安装了Caffe以及OpenCV和其他依赖项。Pycharm运行了两天,今天我不能再在Pycharm中启动Python控制台了。我可以毫无问题地在终端启动python。。。每次我尝试启动Python控制台时,都需要一段时间才能“连接到控制台”,然后我会得到以下结果: /Users/myname/anaconda/bin/python"/应用程序/PyCharm CE. app/内容/助手/p