web-dev-qa-db-ja.com

Rails)を使用して配列を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

21
Ivan Wang

hstoreは、キーと値の両方が単純な非構造化文字列である単純なキー/値ストレージを対象としています。 細かいマニュアル から:

F.16。 hstore

このモジュールは、単一のPostgreSQL値内にキーと値のペアのセットを格納するためのstoreデータ型を実装します。 [...]キーと値は単なるテキスト文字列です。

最後の文に注意してください。hstoreのキーと値は文字列です。つまり、配列を文字列との間で変換するための手持ちがなければ、配列をhstore値に入れることはできず、そのようなことをいじりたくないということです。

ただし、使用可能な JSONデータ型 があります。

8.14。 JSONタイプ

RFC 4627で指定されているように、jsonデータ型を使用してJSON(JavaScript Object Notation)データを格納できます。

jSONは、埋め込まれた配列とオブジェクトを簡単に処理できます。代わりにJSONを使用してみてください。

add_column :users, :properties, :json

ただし、最初に古いhstore列を削除する必要があります。

また、hstoresの配列を格納していなかったため、hstore列にarray: trueが必要ではなく、そのうちの1つが必要でした。

28
mu is too short

ムーの答えを追加します。 Hstoreも数か月以内に非常に有望なアップデートを提供しています(Postgresql 9.4は2014年の第3四半期にリリースされます)。

これらの制限に対処する必要がある今後の変更のいくつか ハイライト

  • スカラーと型(数値、ブール、文字列、NULL)のサポート、および対応する新しい演算子
  • ネストと配列のサポート(著者は、出力形式、つまり角かっこと中括弧をGUC変数で構成することを提案しています)
  • 基本的に、hstoreとJSONの間の完全な互換性により、JSONドキュメントはhstoreのインデックスを最大限に活用できるようになりました(特にGINを使用すると、作成者はJSON検索パフォーマンスの120倍の速度向上を実現しました)

現在、hstoreとjsonのどちらかを選択するのは非常に困難です。あまりにも似ていて、更新が速すぎるからです。

10
Ivan Wang

Muの答えに対する私の2セント。コメントを追加するのに十分な評判がないため、これを回答として投稿しています。

JSONは、「複雑な」データを格納するための頼りになるソリューションになりつつあります。

Hstoreの作者の1人であるOlegBartunov自身は、JSONよりもhstoreを使用する利点はないと述べ、彼は 人々がjsonbを使用することを奨励しています

2014年3月23日 jsonb、jsonを格納するための構造化フォーマット が、pgsql開発メーリングリストに正式に導入されました。

2014年5月15日、JSONBは PostgreSQL 9.4 Beta 1 リリースの発表にリストされました。

JSONB:9.4には、新しいJSONB「バイナリJSON」タイプが含まれています。ドキュメントデータ用のこの新しいストレージ形式は、より高性能であり、JSONデータを操作するためのインデックス作成、関数、および演算子が付属しています。

8
wicz