Знайомство з Erlang [5]

Сьогодні ми розглянемо як працювати в erlang з типом даних postgresql, котрий називається hstore,
і являє собою можливість зберігати в одному полі таблиці key-value структуру даних,
а точніше - як з ерланга записати/отримати значення в/з hstore.

Розпочнемо -

створимо тестову таблицю

CREATE TABLE "test_hstore" (
  "id" bigserial NOT NULL,
  "test777" hstore NOT NULL,
  PRIMARY KEY ("id")
);

додамо в таблицю рядок

INSERT INTO test_hstore (test777) VALUES ('"is_user"=>"1", "is_top"=>"1", "is_admin"=>"0"');

а тепер дістанемо в ерлангу цей рядок -

Mpid = pg:mypg().

^^^
підключились до субд

A = pg:select(Mpid, "SELECT id, test777 FROM test_hstore WHERE id = $1 LIMIT 1", [1]).

^^^ дістаємо, і в змінну A у нас привязалась отака структура -

[{1,
  {[{<<"is_user">>,<<"1">>},
    {<<"is_top">>,<<"1">>},
    {<<"is_admin">>,<<"0">>}]}
}]

далі ми можемо дістати з цієї структури id та hstore-значення,
далі перетворимо останнє в map (для зручності подальшого використання)

[{Id, {DataList}}] = A.
DataMap = maps:from_list(DataList).
#{<<"is_user">> => <<"1">>, <<"is_top">> => <<"1">>, <<"is_admin">> => <<"0">>}

далі - перезапишемо hstore-дані

B = #{"banned" => "0", "frozen" => "0", "is_user" => "0"}.

або

B = #{<<"banned">> => <<"0">>, <<"frozen">> => <<"0">>, <<"is_user">> => <<"0">>}.

перетворимо в структуру, з якою працює epgsql

B2 = maps:to_list(B).
B3 = {B2}.

оновимо

pg:in_up_del(Mpid, "UPDATE test_hstore SET test777 = $1 WHERE id = $2", [B3, 1]).

перевіримо результат

A777 = pg:select(Mpid, "SELECT id, test777 FROM test_hstore WHERE id = $1 LIMIT 1", [1]).

[{1,
 [{<<"is_user">>,<<"0">>},
  {<<"frozen">>,<<"0">>},
  {<<"banned">>,<<"0">>}]}
}]

все супер! не забуваємо закрити з'єднання з субд

epgsql:close(Mpid).

Продовження

Посилання

https://www.postgresql.org/docs/9.5/hstore.html
http://postgresguide.com/cool/hstore.html
https://evtuhovich.ru/blog/2012/01/23/hstore/