当前位置: 首页 > 知识库问答 >
问题:

如何逃离危险?(问号)在Rails中查询Postgresql JSONB类型的运算符

舒赞
2023-03-14

我正在使用Rails 4.2和Postgres 9.4来尝试新的JSONB数据类型。我数据库中的一个JSONB列包含一个数组,我希望能够查询该数组包含某个值的记录。我想出了如何使用新的JSONB“问号”(“包含”)运算符来执行此操作,如下所示:http://www.postgresql.org/docs/9.4/static/functions-json.html

所以在原始SQL我可以让它像这个例子一样工作:

SELECT * FROM people WHERE roles ? '32486d83-4a38-42ba-afdb-f77ca40ea1fc';

但我无法通过ActiveRecord从Rails内部进行此查询。我尝试过使用“where”方法进行原始查询,如下所示:

Person.where("roles ? ?", "32486d83-4a38-42ba-afdb-f77ca40ea1fc")

但由于问号是用于替换参数的特殊字符,我得到了以下错误:

ActiveRecord::准备状态无效:绑定变量(1对2)的错误数量:角色??

我想我需要一种方法来逃离“?”因为我想让它通过字面意思。我试过\?和没有运气。感谢您的帮助!

共有2个答案

伯和蔼
2023-03-14

解决办法。运行此查询以了解操作员映射到的函数:

SELECT 
  oprname, 
  oprcode || '(' || format_type(oprleft,  NULL::integer) || ', ' 
                 || format_type(oprright, NULL::integer) || ')' AS function
FROM pg_operator 
WHERE oprname = '?';

它屈服了

oprname  function
?        jsonb_exists(jsonb, text)
?        exist(hstore, text)

现在在查询中使用函数而不是运算符:

Person.where("jsonb_exists(roles, ?)", "32486d83-4a38-42ba-afdb-f77ca40ea1fc")
林礼骞
2023-03-14

你应该这样称呼它:

Person.where("roles ? :name", name: "32486d83-4a38-42ba-afdb-f77ca40ea1fc")
 类似资料:
  • 我解释了我的问题,我有一个顶点,我定义了所有的路线。我有简单的java类,其中包含我根据路由在顶点中调用的方法。例如,我的下载文件()方法在 MyFile 类中,如下所示: 我在我的垂直类中这样使用这个类: 我的同事告诉我,在顶点中实例化一个类是不好的,当我问他为什么时,他回答说它变得有状态,我怀疑他对我说的话,因为我不知道该怎么做。当我在顶点中声明 MyFile 类实例为“静态 final”时,

  • 问题内容: 我在玩node.js,express和mongoose。 为了立即启动并运行,我将Express查询字符串对象直接传递给mongoose find函数。我很好奇的是,这种做法在实时应用中会有多危险。我知道RDBMS极易受到SQL注入的攻击。除了“清理您的输入”的好建议之外,这段代码有多邪恶: 这意味着获取请求只会将以下内容推送到findDocs函数中: 由于种种原因,这感觉很不好,但是

  • 问题内容: 我正在使用Postgres的json数据类型,但想对嵌套在json中的数据进行查询/排序。 我想订购或查询json数据类型上的.where。例如,我要查询关注者计数> 500的用户,或者要按关注者或关注计数进行订购。 谢谢! 例: 问题答案: 对于任何偶然发现的人。我想出了一个使用ActiveRecord和Postgres的JSON数据类型的查询列表。随时对其进行编辑以使其更加清晰。

  • 问题内容: 如何禁用危险的 评估 功能?可以使用 ini_set 函数完成吗? 还有如何禁用以下功能?我们可以使用 ini_set 函数禁用它们吗? 评估 是坏人可用来开发事物的最危险功能之一。应该有一种无需使用 php.ini 文件就可以禁用它的机制。但应以编程方式完成。 好吧,伙计们,我正在寻找一个答案,建议他们禁用这些危险的可爱家伙,而无需进入 php.ini 文件;我的意思是如何在运行时或

  • 问题内容: 我必须查询成千上万个条目的数据库,并按距指定点的距离对其进行排序。 问题是每个条目都有一个纬度和经度,我需要检索每个条目以计算其距离。对于大型数据库,我不想检索每一行,这可能需要一些时间。 有什么办法可以将其构建到mysql查询中,以便我只需要检索最近的15个条目。 例如 问题答案: 选项1:通过切换到支持GeoIP的数据库对数据库进行计算。 选项2:使用如下存储过程对数据库进行计算:

  • null 但是,如果事件的属性可以由用户定义,则会遇到一个问题,即使用普通相等运算符的属性和使用不相等运算符的属性之间可能发生冲突。 示例:Stripe的API 此示例与第一个示例类似,不同的是它使用分隔符(相当于空格)进行操作,而不是,这样就不会有混淆,因为我的域中的键不能包含空格。 此示例使用单个顶级查询参数来命名下的所有筛选逻辑。这很好,因为您不必担心顶级名称空间冲突。(尽管在我的例子中,所