Repo is a data mapper and DSL on top of equery and epgpool for writing queries and interacting with PostgreSQL databases in Erlang inspired by Ecto.
Here is an example:
app.config
[
{epgpool, [
{database_host, "localhost"},
{database_name, "mydb"},
{database_user, "test_user"},
{database_password, "passwd"}
]}
]
m_weather.erl
-module(m_weather).
-export([schema/0]).
schema() ->
#{ fields => #{
city => #{type => {varchar, 255}},
temp_lo => #{type => integer},
temp_hi => #{type => integer}
prcp => #{type => numeric}
},
table => <<"weather">>
}.
repl
1> repo:all(m_weather, [
q:where(fun([#{city := City}]) -> City =:= <<"Kraków">> end),
%% or repo_utils:like(#{city => <<"Kraków">>}),
q:order_by(fun([#{temp_lo := T}]) -> [{T, asc}] end),
q:limit(10)
]).
You can implement your own custom dbtype encoders and decoders.
All you need is to implement repo_types behaviour and set it via PG_TYPES
macro.
Example for rebar3:
{overrides, [
{override, repo, [
{erl_opts, [
{d, {'PG_TYPES', my_custom_dbtypes}}
]}
]}
]}.
A =:= B
or A < B
, or etc syntax is available through parse_transform.
It's also avaible in repl. But to use in inside modules you need to include
-include_lib("equer/include/equery.hrl").
or use pg_sql:'=:='(A, B)
syntax instead.
Parse transform works only inside q
callbacks.
More documentation will be later...
-
common tests -
100% coverge - spec
- docs
- examples