9

PostgresのHStoreデータ型にネストされたハッシュを含めることができるかどうかさえわかりません。可能な場合は、それらを挿入する方法を教えてください。

これが私がこれまでに試したことです:

-- Database: test1

-- DROP DATABASE test1;
/*
CREATE DATABASE test1
  WITH OWNER = iainuser
       ENCODING = 'UTF8'
       TABLESPACE = pg_default
       LC_COLLATE = 'en_GB.UTF-8'
       LC_CTYPE = 'en_GB.UTF-8'
       CONNECTION LIMIT = -1;
*/
/* create extension hstore; */
/*drop table my_store;*/
/*
create table my_store (
  id serial primary key not null,
  doc hstore
);

CREATE INDEX my_store_doc_idx_gist
  ON my_store
  USING gist
  (doc);
*/
/* select doc from my_store; */
/*
insert into my_store (doc) values ( '"a" => "1"' );
select doc -> 'a' as first_key from my_store; -- returns "1"
*/

/* insert into my_store (doc) values ( '"b" => "c" => "3"' ); -- doesn't work */
/* insert into my_store (doc) values ( '"b" => ("c" => "3")' ); -- doesn't work */
/* insert into my_store (doc) values ( '"b" => hstore("c" => "3")' ); -- doesn't work */
/* insert into my_store (doc) values ( '"b"' => hstore("c" => "3")' ); -- doesn't work */
/* insert into my_store (doc) values ( "b"=>'"c"=>"3"'::hstore ); -- doesn't work */

それが不可能な場合、ネストされたハッシュを操作するための現在受け入れられている標準/イディオムはありますか?おそらくそれらを引き離し、IDを使用してそれらを参照しますか?

これに関する助けをいただければ幸いです。

4

2 に答える 2

14

細かいマニュアルから:

キーと値は単なるテキスト文字列です。

したがって、いいえ、hstoreをhstoreの値として使用することはできません。hstoreの演算子関数を見ると、それらがすべてtext値で機能することがわかります。

ネストされたハッシュを偽造するための標準的なアプローチを知りません。a.b => cキー(の)を構造化する必要があると思いますa => b => c。そうすると、次のようになります。

select slice(doc, array['a.b', 'a.c'])
from my_store
where doc ?& array['a.b', 'a.c']

「サブハッシュ」docを持つそれぞれの「a」スライスを取得します。{b => ..., c => ...}

ニーズにより適している可能性のあるJSONタイプも登場します。しかし、それを待つ必要があり、最終的な実装がどのようになるかはわかりません。

于 2012-06-17T18:47:07.807 に答える
1

これを見た人がたまたまActiveRecordを使用している場合、ネストされたHstoreを使用すると、ネストされたハッシュをhstoreに保存できます。JSONを使用してhstore値をシリアル化し、他の多くのデータ構造もサポートします。

于 2013-11-17T19:17:16.177 に答える