[英]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.