Как получить доступ к столбцу HSTORE с помощью библиотеки PostgreSQL C (libpq)?

Я не могу найти документацию по доступу к данным HSTORE с использованием библиотеки C. В настоящее время я рассматриваю возможность просто преобразовать столбцы HSTORE в массивы в своих запросах, но есть ли способ избежать таких преобразований?


person Muton    schedule 20.03.2014    source источник


Ответы (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.

person Craig Ringer    schedule 21.03.2014
comment
Спасибо! Думаю, в ваших примерах есть небольшая ошибка. Должно быть each вместо hstore_each (по крайней мере, в 9.3). Я измерил это, и, по крайней мере, в моем случае преобразования массива обеспечивают значительно лучшую производительность. - person Muton; 21.03.2014
comment
@Muton Спасибо, исправлено. Я всегда путаю это с json_each. - person Craig Ringer; 21.03.2014