【问题标题】:Is it possible, and what is the syntax for a nested hash in Postgresql's HStore type?是否有可能,Postgresql 的 HStore 类型中嵌套哈希的语法是什么?
【发布时间】:2023-03-18 04:53:01
【问题描述】:

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

对此的任何帮助将不胜感激。

【问题讨论】:

    标签: postgresql postgresql-9.1 hstore


    【解决方案1】:

    来自fine manual

    键和值只是文本字符串。

    所以,不,您不能将 hstore 用作 hstore 中的值。如果您查看hstore operatorsfunctions,您会发现它们都适用于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']
    

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

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

    【讨论】:

    • 如果这不能满足您的需要,您可以将 hstore 转换为文本,然后转义引号以获取可以保存为 hstore 中的值的字符串,但它可能使用起来不会那么方便。您可能需要考虑对数据进行更多规范化。
    • 感谢您澄清这一点,我很感激。我确实在手册中阅读了该页面(这是一本很好的手册),但它甚至没有插入示例,所以想知道是否还有更复杂的示例也被遗漏了。 @kgrittn 我认为强制转换将是我最终采用的路线,在这种情况下我不需要规范化数据(实际上只是一个作为 blob 的文档),除非这是将文档放入数据库的唯一方法!
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      • 1970-01-01
      • 2013-12-06
      相关资源
      最近更新 更多