【问题标题】:How do I search for a substring in a JSON field in MySQL (Knex/Bookshelf)?如何在 MySQL (Knex/Bookshelf) 的 JSON 字段中搜索子字符串?
【发布时间】:2019-12-09 17:47:40
【问题描述】:

我将 Bookshelf/Knex 用于 ORM。我有一个 MySQL 数据库,其中有一个表,其中包含一个名为“数据”的 JSON 字段。在该字段内,有一个关键的“标题”和一个关键的“消息”。我想返回 data.title 或 data.message 中具有子字符串“searchString”的所有行。我该怎么做?

这行得通吗?

qb.raw(`data->'title' LIKE ${searchString} OR data->'message LIKE ${searchString}`)

【问题讨论】:

  • 您是否尝试在您的实际 SQL 查询中执行此操作?
  • 如果我必须下拉到 knex.raw,是的。
  • 哦,我误读了这个问题。对不起!

标签: mysql knex.js bookshelf.js


【解决方案1】:

这是没有SQL注入漏洞的方法:

const results = await new Modelname()
                .query((qb) => {
                        qb.whereRaw(
                           `JSONColumnName->
                               '$.JSONFieldName' LIKE ?`, [`%${searchString}%`])
                })
                .fetch();

【讨论】:

    【解决方案2】:

    这行得通:

    const results = await new Modelname()
                    .query((qb) => {
                            qb.whereRaw(
                               `JSONColumnName->
                                   '$.JSONFieldName' LIKE "%${searchString}%"`)
                    })
                    .fetch();
    

    “JSONColumnName”是 JSON 列的名称,“JSONFieldName”是该列中某个 JSON 字段的名称。

    【讨论】:

    • 该方案存在SQL注入漏洞。永远不要将 searchString 直接插入 SQL 字符串。
    猜你喜欢
    • 2021-11-10
    • 2013-05-10
    • 2019-05-06
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多