README.md

# Erlang Embedded SQL library

This library allows you to represent SQL sentences as Erlang
terms. Please, consider it as a failed **proof of concept**, it is
incomplete and we do not recommend to be used in production.

A pretty print function generates SQL in the form of an Extended
Query: `iodata()` + parameters. The is directly usable in second and
third parameter of `epgsql:equery/3`. The SQL string (`iodata()`) is
directly used in the second argument of `epgsql:parse/2`.

## Usage

Let's write a representation of this SQL query:

```sqp
SELECT users.name, emails.address FROM users INNER JOIN emails ON users.id = emails.id
```

In eesql, the following term represents the previous query:

```erlang
Q = #select{
      columns = ['users.name','emails.address'],
      from = [#join{type = inner,
                    left = users
                    right = emails
                    on = {'users.id','=','emails.id'}}]
}.
```

Now, you can generate the SQL ready for the actual query:

```erlang
1> {S,P} = eesql:to_sql(Q).
{[["SELECT ","ALL"," ",
   [<<"users.name">>,", ",<<"emails.address">>],
   [" FROM ",
    [[<<"users">>,32,
      [["INNER",32,"JOIN ",<<"emails">>,32,"ON",32,
        [<<"users.id">>," ",<<"=">>," ",<<"emails.i"...>>]]]]]],
   [],[],[],[],[]],
  ";"],
 []}
```

Just to check:

```erlang
2> iolist_to_binary(S).
<<"SELECT ALL users.name, emails.address FROM users INNER JOIN emails ON users.id = emails.id;">>
```

You can find more usage examples in `tests/eesql_tests.erl`.