我可以使用Rails在hstore中存储数组

时间:2014-03-10 16:57:10

标签: ruby-on-rails arrays postgresql ruby-on-rails-4 hstore

我想保存这样的数据:

User.create(name:"Guy", properties:{url:["url1","url2","url3"], street_address:"asdf"})

我可以在Rails 4中这样做吗?到目前为止,我尝试过迁移: add_column :users, :properties, :hstore, array: true

但是当我在hstore中保存数组时,它会返回错误:

PG::InvalidTextRepresentation: ERROR: array value must start with "{" or dimension information

3 个答案:

答案 0 :(得分:28)

hstore用于简单的键/值存储,其中键和值都是简单的非结构化字符串。来自fine manual

  

<强> F.16。 hstore

     

此模块实现store数据类型,用于在单个PostgreSQL值中存储键/值对集合。 [...]键和值只是文本字符串。

注意最后一句:hstore中的键和值是字符串。这意味着你不能将数组放在hstore值中,如果没有一些手持操作来将数组转换为字符串和从字符串转换数组,你真的不想乱搞那种东西。

但是,有JSON data type可用:

  

<强> 8.14。 JSON类型

     

json数据类型可用于存储JSON(JavaScript Object Notation)数据,如RFC 4627中所述。

和JSON可以轻松处理嵌入式数组和对象。请尝试使用JSON:

add_column :users, :properties, :json

您首先必须删除旧的hstore列。

此外,由于您没有存储array: true的数组,因此您不希望在hstore列上显示hstore,而您只需要其中一个。

答案 1 :(得分:10)

加上穆的回答。 Hstore也在几个月内提供了非常有前景的更新(Postgresql 9.4将于2014年第3季度推出)。

一些highlights即将发生的变化应该解决这些限制:

  • 支持标量和类型(数字,布尔值,字符串,NULL) 支持,以及新的相应运营商
  • 支持嵌套和数组(作者提出输出 格式,即括号v。花括号,用GUC配置 变量)
  • 基本上,hstore和JSON之间完全兼容,所以JSON 文档现在可以充分利用hstore的索引(使用GIN 特别是,作者提出了120倍的速度提升 JSON搜索性能)

现在很难在hstore和json之间选择一个。因为它们变得过于相似并且更新太快。

答案 2 :(得分:8)

我对穆的回答是2美分。我将此作为答案发布,因为我没有足够的声誉来添加评论。

JSON正成为存储&#34;复杂&#34;的首选解决方案。数据

Oleg Bartunov-- hstore的作者之一 - 他自己说使用hstore而不是JSON和encourages people use jsonb没有优势。

2014年3月23日jsonb, a structured format for storing json,正式在pgsql开发邮件列表中引入。

2014年5月15日,JSONB被列入PostgreSQL 9.4 Beta 1发布公告。

  

JSONB:9.4包含新的JSONB&#34;二进制JSON&#34;类型。这种用于文档数据的新存储格式具有更高的性能,并带有用于处理JSON数据的索引,函数和运算符。