libpqtypes
semble avoir un certain support pour hstore
.
Une autre option consiste à éviter d'interagir directement avec hstore
dans votre code. Vous pouvez toujours en bénéficier dans la base de données sans vous occuper de sa représentation textuelle côté client. Supposons que vous souhaitiez récupérer un champ hstore ; vous utilisez simplement :
SELECT t.id, k, v FROM thetable t, LATERAL each(t.hstorefield);
ou sur les anciennes versions de PostgreSQL, vous pouvez utiliser la forme originale et non standard set-returning-function-in-SELECT :
SELECT t.id, each(t.hstorefield) FROM thetable t;
(mais faites attention si vous sélectionnez plusieurs enregistrements de t
de cette façon, vous obtiendrez des résultats étranges alors que LATERAL
ira bien).
Une autre option consiste à utiliser hstore_to_array
ou hstore_to_matrix
lors de l'interrogation, si vous êtes à l'aise avec la représentation de tableaux PostgreSQL.
Pour créer des valeurs hstore, vous pouvez utiliser les constructeurs hstore qui prennent des tableaux. Ces tableaux peuvent à leur tour être créés avec array_agg
sur un VALUES
clause si vous ne voulez pas gérer la représentation de tableau de PostgreSQL dans votre code.
Tout ce gâchis devrait disparaître à l'avenir, car PostgreSQL 9.4 aura probablement une bien meilleure interopérabilité entre les types hstore et json, vous permettant d'utiliser simplement la représentation json lors de l'interaction avec hstore.