【问题标题】:Sequelize wrap column with " in where condition在 where 条件下用 " 续集换行列
【发布时间】:2019-12-11 16:42:55
【问题描述】:

我在 DB 中有一个 JSONB 列。

我想向 DB 提出请求,我可以在其中检查此 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 */],
})

并 sequelize 产生不好的结果,例如:

SELECT *
FROM table
WHERE "(json_column"."->'data'->>'data2')::boolean" = true AND id = '00000000-1111-2222-3333-456789abcdef'
LIMIT 1

. 拆分我的列,并将" 添加到每个元素。

知道如何避免在 where 条件下将 " 添加到列中吗?

编辑: 这是我对sequelize.literal() 的查询:

const someVariableWithColumnName = 'data2';
    Model.findOne({
      where: {
        [sequelize.literal(`$("json_column"->'data'->>'${someVariableWithColumnName}')::boolean$`)]: true,
        id: someIdVariable,
      },
      order: [/* some order, doesn't matter */],
    })

【问题讨论】:

    标签: javascript node.js postgresql orm sequelize.js


    【解决方案1】:

    您可以使用Sequelize.literal() 来避免虚假引号。恕我直言,将 json 处理包装在 db 函数中也可能会有所帮助。

    【讨论】:

    • 使用 Sequelize.literal() 我得到了这样的结果: ...WHERE "[Object object]" = true AND...
    • Sequelize.literal 需要一个字符串,而不是一个对象。希望我可以测试一下,但我们是 MySql 商店。也许如果你用 literal() 发布确切的代码?
    • 我认为你应该删除字面量()周围的方括号 []....
    • 我无法删除 [] 因为它是对象中的关键
    【解决方案2】:

    我刚刚遇到了一个类似的用例。

    我相信您可以将静态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 }
    ]
    })
    

    【讨论】:

      猜你喜欢
      • 2019-11-27
      • 2011-09-02
      • 2015-03-05
      • 2011-03-09
      • 2012-04-14
      • 2018-10-04
      • 2021-05-25
      • 2017-08-18
      • 1970-01-01
      相关资源
      最近更新 更多