我有一个 postgres jsonb 查询如下:
Blog.where("upload_data @> '[ { \"name\": \"#{name}\" }]'")
它可以工作,但会破坏构建,因为优秀的刹车员指出了可能的 SQL 注入风险。如果我使用绑定变量:
Blog.where("upload_data @> '[ { \"name\": ? }]'", name)
它创建一个 sql 查询,例如:
WHERE upload_data @> '[ { "name": 'name' }]'
请注意单引号 - 这是无效的查询
如果我使用单引号,我会得到:
WHERE upload_data @> "[ { 'name': 'name' }]"
这是无效的
我尝试了其他一些方法,但我想要的是将绑定变量计算为带双引号的字符串:
WHERE upload_data @> '[ { "name": "name" }]'
或者一个不同的解决方案 - 除了让刹车员跳过文件之外。
您不能将参数占位符放在带引号的字符串内。
Rails 允许您执行此操作并在单引号字符串中替换单引号字符串,这一事实表明 Rails 未能(像往常一样)理解 SQL 规则。
但是您可以将参数占位符与其他字符串一起放入表达式中。我不是普通的 PostgreSQL 用户,但我假设您可以将字符串连接在一起以形成完整的 JSON 文字:
Blog.where("upload_data @> '[ { \"name\": \"' || ? || '\"}]'", name)
您可能会发现,如果参数化整个 JSON 值,您的代码会更加清晰。使用%Q()
以避免需要反斜杠文字双引号。
Blog.where("upload_data @> ?", %Q([ { "name": "#{name}" } ]))
或者为了确保生成有效的 JSON,我将表达式放入 Ruby 语法中,然后转换为 JSON:
Blog.where("upload_data @> ?", JSON.generate( [{name: name}] ))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)