Я не могу найти документацию по доступу к данным HSTORE с использованием библиотеки C. В настоящее время я рассматриваю возможность просто преобразовать столбцы HSTORE в массивы в своих запросах, но есть ли способ избежать таких преобразований?
Как получить доступ к столбцу HSTORE с помощью библиотеки PostgreSQL C (libpq)?
Ответы (1)
libpqtypes
имеет некоторую поддержку hstore
.
Другой вариант — избегать прямого взаимодействия с hstore
в вашем коде. Вы по-прежнему можете использовать его в базе данных, не имея дело с его текстовым представлением на стороне клиента. Скажем, вы хотите получить поле hstore; вы просто используете:
SELECT t.id, k, v FROM thetable t, LATERAL each(t.hstorefield);
или в старых версиях PostgreSQL вы можете использовать причудливую и нестандартную форму set-returning-function-in-SELECT:
SELECT t.id, each(t.hstorefield) FROM thetable t;
(но будьте осторожны, выбирая таким образом несколько записей из t
, вы получите странные результаты, тогда как LATERAL
будет в порядке).
Другой вариант — использовать hstore_to_array
или hstore_to_matrix
при запросе, если вам удобно работать с представлением массива PostgreSQL.
Для создания значений hstore вы можете использовать конструкторы hstore, которые принимают массивы. Эти массивы, в свою очередь, могут быть созданы с помощью array_agg
над предложением VALUES
, если вы не хотите иметь дело с представлением массива PostgreSQL в своем коде.
Весь этот беспорядок должен исчезнуть в будущем, так как PostgreSQL 9.4, вероятно, будет иметь гораздо лучшее взаимодействие между типами hstore и json, позволяя вам просто использовать представление json при взаимодействии с hstore.
each
вместо hstore_each
(по крайней мере, в 9.3). Я измерил это, и, по крайней мере, в моем случае преобразования массива обеспечивают значительно лучшую производительность.
- person Muton; 21.03.2014
json_each
.
- person Craig Ringer; 21.03.2014