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 => cfor a => b => c),然后你可以这样:

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

doc抓取每个具有{b => ..., c => ...}“子哈希”的“a”切片。

还有一种JSON 类型即将出现,它可能更适合您的需求。但是,你必须等待它,我不确定最终的实现会是什么样子

于 2012-06-17T18:47:07.807 回答
1

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

于 2013-11-17T19:17:16.177 回答