是否可能,以及Postgresql的HStore类型中嵌套哈希的语法是什么?

时间:2012-06-17 17:54:21

标签: postgresql postgresql-9.1 hstore

我甚至不确定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来引用它们?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:14)

来自fine manual

  

键和值只是文本字符串。

所以,不,你不能在hstore中使用hstore作为值。如果您查看hstore operatorsfunctions,您会发现它们都符合text值。

我不知道伪装嵌套哈希的任何标准方法。我怀疑你必须构建密钥(a.b => c的{​​{1}}),然后就可以这样:

a => b => c

获取具有select slice(doc, array['a.b', 'a.c']) from my_store where doc ?& array['a.b', 'a.c'] “子哈希”的每个doc的“a”切片。

还有JSON type即将出现,可能更适合您的需求。但是,你必须等待它,我不确定what the final implementation will look like

答案 1 :(得分:0)

如果看到这个的人碰巧使用ActiveRecord,Nested Hstore允许您在hstore中存储嵌套的哈希值。它使用JSON序列化hstore值,并支持许多其他数据结构。