如何使用Sequelize的queryInterface.bulkUpdate检查jsonb列是否存在指定键
方案1:使用Sequelize.literal拼接原生SQL(最稳妥,和你目标SQL逻辑完全对齐)
这种写法直接复用已验证的SQL条件,不需要额外记忆Sequelize操作符映射规则:
'use strict'; module.exports = { up: async (queryInterface, Sequelize) => { await queryInterface.bulkUpdate( 'messages', { type: 'products' }, // WHERE条件配置 { type: 'gallery', [Sequelize.Op.and]: Sequelize.literal(`content ? 'textMain'`) } ) }, down: async (_queryInterface, _Sequelize) => { // 回滚逻辑按需补充 } };
注意:你原SQL中
content ? '%textMain%'的写法存在误区:PostgreSQL的?运算符仅用于判断JSONB顶层是否存在指定字符串的键,不支持LIKE通配符。如果你的需求是模糊匹配JSONB字段内的任意字符串,需要将条件改为content::text LIKE '%textMain%',替换Sequelize.literal内的内容即可。
方案2:使用Sequelize内置JSONB操作符
PostgreSQL的?运算符在Sequelize中对应的操作符是Op.hasKey,写法更符合ORM编码规范:
'use strict'; module.exports = { up: async (queryInterface, Sequelize) => { // 解构获取Sequelize操作符 const { Op } = Sequelize; await queryInterface.bulkUpdate( 'messages', { type: 'products' }, { type: 'gallery', content: { [Op.hasKey]: 'textMain' } } ) }, down: async (_queryInterface, _Sequelize) => { // 回滚逻辑按需补充 } };
内容的提问来源于stack exchange,提问作者Raphael Monteiro
相关产品推荐
相关产品推荐

