Mysql 5.7 json 数据类型,在 Rails 5 中使用 activerecord 查询

Posted

技术标签:

【中文标题】Mysql 5.7 json 数据类型,在 Rails 5 中使用 activerecord 查询【英文标题】:Mysql 5.7 json datatype, query with activerecord in Rails 5 【发布时间】:2016-09-14 23:39:31 【问题描述】:

我正在使用 Rails 5 rc1 创建一个应用程序。 Rails 5 支持 mysql 5.7 json 数据类型。

add_column :organizations, :external, :json

假设该列的值如下:

+---------------------------+
| external                  |
+---------------------------+
| "id": 10, "type": "mos" |
+---------------------------+

要在外部列中搜索特定的“id”和“type”,我在 mysql 中使用以下查询:

select external from organizations where JSON_CONTAINS(external,'"id": 10, "type": "mos"') ;

现在,我想知道如何使用 rails 进行相同的查询。 以下不起作用:

Organization.where("JSON_CONTAINS(external,'"id": 10, "type": "mos"')")

注意:我无法删除 json 文本周围的引号,因为它是查询的一部分。

【问题讨论】:

【参考方案1】:

您仍然可以利用 ActiveRecord 的 where 方法并绑定变量,而无需借助 find_by_sql。

Organization.where("external->'$.id' = :id and external->'$.type' = :type", id: 10, type: "mos")

【讨论】:

这仅适用于postgresql,不适用于mysql。 在 Rails 5.1 和 Mysql 5.7 中为我工作 不适用于 MariaDB 10.4,但 JSON_EXTRACT() 可以。【参考方案2】:

使用 MYSQL,您可以使用 JSON_EXTRACT 从存储在字段中的 JSON 对象中提取值。在您的情况下,请尝试使用...

Organization.where("JSON_EXTRACT(external, '$.id') = 10 AND JSON_EXTRACT(external, '$.type') = 'mos'")

只是为了好玩,在伪代码中......

<Class>.where("JSON_EXTRACT(<column_header>, '$.<object key>') <comparison operator> <object value>")

这应该可以完成工作,尽管可能有更漂亮的方式来编写它:)

【讨论】:

我更喜欢这个,因为它适用于 MySQL 和 MariaDB。【参考方案3】:

像这样:

id_field = '$."id"'
type_field = '$."type"'    
Organization.where("JSON_UNQUOTE(json_extract(external, '#id_field')) = ? AND JSON_UNQUOTE(json_extract(external, '#type_field')) = ?", 10, "mos")

【讨论】:

【参考方案4】:

到目前为止,我还没有通过 activerecord 找到任何解决方案。另一种查询方式如下:

type = "mos"
id = 10

organization = Organization.find_by_sql(["select * from organizations where JSON_CONTAINS(external_ref ,'\"id\": ?, \"type\": \"#ActiveRecord::Base::sanitize(type).remove("'")\"')", id]).first

一旦有带有activerecord查询接口的解决方案,我会更新。

【讨论】:

以上是关于Mysql 5.7 json 数据类型,在 Rails 5 中使用 activerecord 查询的主要内容,如果未能解决你的问题,请参考以下文章

Mysql 5.7 json 数据类型,在 Rails 5 中使用 activerecord 查询

mysql 5.7 json 类型 json 数组类型 普通字符串类型 10w数据 查询速度差异

MySQL 5.7新支持--------Json索引创建实战

使用hibernate在Mysql 5.7数据库中存储/检索Json数据

MySQL 5.7原生JSON格式支持

MySQL 5.7原生JSON格式支持