我在数据库中有一个JSONB列。
我想向数据库发出请求,我可以在其中检查此JSON中的某些值是对还是错:
SELECT *
FROM table
WHERE ("json_column"->'data'->>'data2')::boolean = true AND id = '00000000-1111-2222-3333-456789abcdef'
LIMIT 1
所以,我的续集请求:
const someVariableWithColumnName = 'data2';
Model.findOne({
where: {
[`$("json_column"->'data'->>'${someVariableWithColumnName}')::boolean$`]: true,
id: someIdVariable,
},
order: [/* some order, doesn't matter */],
})
续集会产生类似以下的不良结果
SELECT *
FROM table
WHERE "(json_column"."->'data'->>'data2')::boolean" = true AND id = '00000000-1111-2222-3333-456789abcdef'
LIMIT 1
通过.
拆分我的列,并将"
添加到每个元素。
有什么想法可以摆脱在何处条件下向列中添加"
的情况?
编辑:
这是我对sequelize.literal()
的查询:
const someVariableWithColumnName = 'data2';
Model.findOne({
where: {
[sequelize.literal(`$("json_column"->'data'->>'${someVariableWithColumnName}')::boolean$`)]: true,
id: someIdVariable,
},
order: [/* some order, doesn't matter */],
})
答案 0 :(得分:0)
您可以使用Sequelize.literal()
来避免虚假引号。恕我直言,将json处理包装在db函数中也可能会有帮助。
答案 1 :(得分:0)
我刚刚遇到了一个类似的用例。
我相信您可以将静态 sequelize.where
方法与 sequelize.literal
结合使用。
这是 sequelize API 参考中的相应文档:https://sequelize.org/master/class/lib/sequelize.js~Sequelize.html#static-method-where 这是常规文档中的一个示例(尽管我承认很难找到): https://sequelize.org/master/manual/model-querying-basics.html#advanced-queries-with-functions--not-just-columns-
最后,对于您的特定坐姿,请尝试以下操作:
const someVariableWithColumnName = 'data2';
Model.findOne({
where: {
[Op.and]: [
// We provide the virtual column sql as the first argument of sequelize.where with sequelize.literal.
// We provide the matching condition as the second argument of sequelize.where, with the usual sequelize syntax.
sequelize.where(sequelize.literal(`$("json_column"->'data'->>'${someVariableWithColumnName}')::boolean$`), { [Op.eq]: true }),
{ id: someIdVariable }
]
})