Give your SQL some love
Crystal
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
spec Loads multiple files at once in spec file (#10) Oct 14, 2016
src fix for 0.20.5 (#11) Feb 1, 2017
.gitignore
.travis.yml first parser on train 50km/h Oct 8, 2016
CHANGELOG.md Add Tren.escape_character= Oct 29, 2016
LICENSE first parser on train 50km/h Oct 8, 2016
README.md Add Tren logo. Thanks @f <3 Oct 29, 2016
logo.png Add Tren logo. Thanks @f <3 Oct 29, 2016
logo.svg Add Tren logo. Thanks @f <3 Oct 29, 2016
shard.yml

README.md

Tren Logo

Build Status

Tren lets you use your SQL as a first class method in your Crystal code.

Installation

Add this to your application's shard.yml:

dependencies:
  tren:
    github: sdogruyol/tren

Usage

Create a simple SQL file. The first line must be -- name: your_method_name(args).

-- name: get_users(name : String, surname : String)

SELECT * FROM users WHERE name = '{{ name }}' AND surname = '{{ surname }}'

Require Tren and load your SQL file. It's going to create a first class method to your SQL.

require "tren"

Tren.load("/path/to/your/file.sql")

# Or you can load multiple files at once:
Tren.load("./db/**/*.sql")

Overloading

-- name: get_users(name : String, surname : String)

SELECT * FROM users WHERE name = '{{ name }}' AND surname = '{{ surname }}'
-- name: get_users(name : String, age : Int32)

SELECT * FROM users WHERE name = '{{ name }}' AND age = {{ age }}

Meaningful Compiler Errors

Since Tren is creating native Crystal methods, you can see meaningful errors on compile process.

in ./your/file: no overload matches 'get_users' with types String, Bool
Overloads are:
 - get_users(name : String, surname : String)
 - get_users(name : String, age : Int32)

    get_users("john", true)

Prevent SQL Injections

SQL statements are escaped by default. But you are able to make injectable (raw) parameters by writing ! to the parameter.

-- name: get_users(name : String, surname : String)

SELECT * FROM users WHERE name = '{{! name }}' AND surname = '{{! surname }}'

Composing SQLs

You can compose Tren methods easily to be DRY.

-- name: filter_user(name : String, surname : String)

WHERE name = '{{ name }}' AND surname = '{{ surname }}'

Let's reuse this now:

-- name: get_users(name : String, surname : String)

SELECT * FROM users {{! filter_user(name, surname) }}

Escape Character

For example PostgreSQL uses '' for escaping string. To set your escape character for postgresql.

Tren.escape_character = "\\'"

Contributing

  1. Fork it ( https://github.com/sdogruyol/tren/fork )
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request

Contributors

  • f Fatih Kadir Akın - creator, maintainer
  • sdogruyol Serdar Doğruyol - creator, maintainer

Built on a TREN from Ankara to Istanbul.