ublog

Знайомство з n2o - 5

programming [33]erlang [32]n2o [17]postgresql [9]

Вітаю!

Сьогодні ми розглянемо як працювати в erlang (не обовязково в n2o) з типом даних 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).


Далі буде =)