2012-06-17 6 views
9

Ni siquiera estoy seguro de que el tipo de datos HStore de Postgres pueda contener hashes anidados, y si pueden, ¿cómo insertarlos?¿Es posible, y cuál es la sintaxis para un hash anidado en el tipo HStore de Postgresql?

Aquí es lo que he probado hasta ahora:

-- 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 */ 

Si no es posible, es que hay una corriente estándar/idioma aceptado para trabajar con los hashes anidados - tal vez separarlos y se refieren a ellos utilizando identificadores?

Cualquier ayuda con esto sería muy apreciada.

Respuesta

14

Desde el fine manual:

claves y los valores son simplemente cadenas de texto.

Así que, no, no puede usar un hstore como valor en un hstore. Si mira el hstore operators y el functions, verá que todos funcionan con los valores text.

No conozco ningún enfoque estándar para falsificar hashes anidados. Sospecho que tendría que estructurar las teclas (a.b => c para a => b => c), entonces se podría así que cosas como esta:

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

para agarrar el "un" trozo de cada doc que tiene el {b => ..., c => ...} "sub-hash" .

También hay un JSON type próximo que podría ser más adecuado a sus necesidades. Pero, tendrá que esperar y no estoy seguro what the final implementation will look like.

+1

Si esto no le da deseo, puede convertir un hstore en texto y luego escapar de las comillas para obtener una cadena que podría guardarse como el valor en un hstore, pero probablemente no sería eso conveniente de usar Es posible que desee considerar un poco más la normalización de los datos. – kgrittn

+0

Gracias por aclarar eso, lo agradezco. Leí esa página en el manual (y es un buen manual) pero ni siquiera tenía un ejemplo de inserto, por lo que me pregunté si habría ejemplos más complejos que también se hubieran omitido. @kgrittn Creo que el casting será la ruta que terminaré tomando, no necesito datos normalizados en esta instancia, (solo un documento como blob realmente), ¡a menos que sea la única forma de obtener el documento en la base de datos! – iain

0

Si alguien que ve esto pasa a estar usando ActiveRecord, Nested Hstore le permite almacenar hashes anidados en un hstore. Serializa los valores de hstore utilizando JSON y también admite varias otras estructuras de datos.

Cuestiones relacionadas