Знайомство з 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/