2012-06-17 8 views
9

私はPostgresのHStoreデータ型にネストされたハッシュを入れることはできません。ここでPostgresqlの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を使用してそれらを参照してください?

これについてのお手伝いがあれば幸いです。 fine manualから

答えて

14

キーと値は単純にテキスト文字列です。

したがって、hstoreをhstoreの値として使用することはできません。 hstore operatorsfunctionsを見ると、すべてがtextの値で動作することがわかります。

ネストされたハッシュを捏造するための標準的なアプローチはわかりません。私はあなたがキー(a => b => ca.b => c)を構築する必要があるだろう疑いがある場合、あなたはので、このようなことができます

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

{b => ..., c => ...}「サブハッシュ」を持っている各docの「」スライスをつかむために。

また、お客様のニーズに適したJSON typeもあります。しかし、あなたはそれを待つ必要がありますし、私は確信していませんwhat the final implementation will look like

+1

もしあなたが望むものでなければ、hstoreをテキストにキャストして引用符をエスケープして、hstoreの値として保存できる文字列を得ることができるかもしれませんが、使用するのに便利です。データの正規化をもう少し検討することをお勧めします。 – kgrittn

+0

これをクリアしていただきありがとうございます、私はそれを感謝します。私はマニュアルのそのページを読んだことがありますが(それは良いマニュアルです)、挿入物の例さえないので、あまりにも複雑な例が残っていたかどうか疑問に思っていました。 @kgrittnキャストは私が最終的なルートになると思います。データベースにドキュメントを取得する唯一の方法でない限り、このインスタンスで正規化されたデータは必要ありません。 – iain

0

ActiveRecordを使用している人がいる場合は、Nested Hstoreを使用すると、ネストされたハッシュをhstoreに格納できます。 JSONを使用してhstore値をシリアライズし、他の多くのデータ構造もサポートしています。

関連する問題