繁体   English   中英

如何将 PostgreSQL 查询转换为 Sequalize.js 查询?

[英]How to convert PostgreSQL query to Sequalize.js query?

我有一个名为Test的表,其中包含以下数据

桌子

Test
-----
id | org_id | metadata (It's a JSONB column)
---------------------------------------
1  | 65t7   | { "term": "price_12", "status": "Declined", "switch": "Cisco", "capacity": 109951162777600 }
2  | 65t7   | { "term": "price_13", "status": "Declined", "switch": "Cisco", "capacity": 988951162656789 }
3  | 45t4   | { "term": "amice_12", "status": "Declined", "switch": "Cisco", "capacity": 109951162777600 }
4  | 65t7   | { "term": "werwe_12", "status": "Declined", "switch": "Cisco", "capacity": 174637726481230 }

我在查询下方运行并获取 output

SELECT * FROM public.Test 
where org_id = '65t7' 
and metadata->> 'term' iLike '%ice_12%' 
and (metadata->> 'capacity')::bigint = 109951162777600;

Output

id | org_id | metadata
---------------------------------------
1  | 65t7   | { "term": "price_12", "status": "Declined", "switch": "Cisco", "capacity": 109951162777600 }

我正在尝试将其转换为 Sequalize 格式查询

代码

let final = {
    where: {
        org_id : '65t7',
        [Op.and]: [
            { 'metadata.term':  { [Op.iLike]: '%ice_12%' }},
            { 'metadata.capacity':  { [Op.is]: 109951162777600 }}
        ]
    }
    limit: 500,
    offset: 0
};

const res = Test.findAndCountAll(final);

错误:

at Query.run (C:\Project\test\FilterTest\node_modules\sequelize\dist\lib\dialects\postgres\query.js:50:25)
    at C:\Project\test\FilterTest\node_modules\sequelize\dist\lib\sequelize.js:300:28
    at processTicksAndRejections (internal/process/task_queues.js:95:5)
    at async PostgresQueryInterface.rawSelect (C:\Project\test\FilterTest\node_modules\sequelize\dist\lib\dialects\abstract\query-interface.js:415:18)
    at async Function.aggregate (C:\Project\test\FilterTest\node_modules\sequelize\dist\lib\model.js:1229:19)
    at async Function.count (C:\Project\test\FilterTest\node_modules\sequelize\dist\lib\model.js:1252:20)
    at async Promise.all (index 0)
    at async Function.findAndCountAll (C:\Project\test\FilterTest\node_modules\sequelize\dist\lib\model.js:1268:27) {
  name: 'SequelizeDatabaseError',
  parent: error: column test.metadata.term does not exist
      at Parser.parseErrorMessage (C:\Project\test\FilterTest\node_modules\pg-protocol\dist\parser.js:287:98)
      at Parser.handlePacket (C:\Project\test\FilterTest\node_modules\pg-protocol\dist\parser.js:126:29)
      at Parser.parse (C:\Project\test\FilterTest\node_modules\pg-protocol\dist\parser.js:39:38)
      at Socket.<anonymous> (C:\Project\test\FilterTest\node_modules\pg-protocol\dist\index.js:11:42)
      at Socket.emit (events.js:400:28)
      at addChunk (internal/streams/readable.js:293:12)
      at readableAddChunk (internal/streams/readable.js:267:9)
      at Socket.Readable.push (internal/streams/readable.js:206:10)
      at TCP.onStreamRead (internal/stream_base_commons.js:188:23) {

搜索 JSONB 时,不能使用“.”。 访问 JSON 字段中的密钥。

相反,尝试编写一个普通的 object。

我删除了[Op.and]因为当您在where选项中有多个键值时,这是默认连接器。 我还删除了不必要的[Op.is]

const final = {
    where: {
        org_id : '65t7',
        metadata: { 
            term: {
                [Op.iLike]: '%ice_12%' 
            },
            capacity: 109951162777600
        }
    }
    limit: 500,
    offset: 0
};

const res = await Test.findAndCountAll(final);

请注意,使用无顺序的偏移/限制,不能保证您的结果每次都相同。 如果您打算进行分页,请添加order选项以确保 offset/limit 始终分割相同的子集。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM