Data mapper and DSL for writing queries and interacting with PostgreSQL in Erlang.
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
include
src
test
.gitignore
.travis.yml
LICENSE
README.md
rebar.config
rebar.config.script
rebar.lock

README.md

Build Status Coverage Status GitHub tag Hex.pm

Repo

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)
   ]).

Custom db type converters

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}}
        ]}
    ]}
]}.

Notice

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...

TODO

  • common tests
  • 100% coverge
  • spec
  • docs
  • examples