
# Mojo::SQL

  Safely generate and compose SQL statements from [Perl](https://perl.org).

```perl
use Mojo::SQL qw(sql);

# {text => 'SELECT * FROM users WHERE name = $1', values => ['sebastian']}
my $query = sql('SELECT * FROM users WHERE name = ?', 'sebastian')->to_query;
```

To prevent SQL injection attacks, every `?` in the input becomes a placeholder in the generated query, with the
corresponding value bound to it. Partial statements can even be used recursively to build more complex queries.

```perl
my $role    = 'admin';
my $partial = sql('AND role = ?', $role);
my $name    = 'root';

# {text => 'SELECT * FROM users WHERE name = $1 AND role = $2', values => ['root', 'admin']}
my $query = sql('SELECT * FROM users WHERE name = ? ?', $name, $partial)->to_query;
```

Make partial statements optional to dynamically generate `WHERE` clauses.

```perl
my $optional = $foo ? sql('AND foo IS NOT NULL') : sql('');
my $query    = sql('SELECT * FROM users WHERE name = ? ?', 'sebastian', $optional)->to_query;
```

And if you need a little more control over the generated SQL query, you can also bypass safety features with
`sql_unsafe`. But make sure to handle unsafe values yourself with appropriate escaping functions for your database. For
PostgreSQL there are `escape_literal` and `escape_identifier` functions included with this module.

```perl
use Mojo::SQL qw(sql sql_unsafe escape_literal);

my $role    = 'role = ' . escape_literal('power user');
my $partial = sql_unsafe('AND ?', $role);
my $name    = 'root';

# {text => "SELECT * FROM users WHERE name = $1 AND role = 'power user'", values => ['root']}
my $query = sql('SELECT * FROM users WHERE name = ? ?', $name, $partial)->to_query;
```

For databases that do not support numbered placeholders like `$1` and `$2`, you can set a custom character with the
`placeholder` option.

```perl
# {text => 'SELECT * FROM users WHERE name = ?', values => ['root']}
my $query = sql('SELECT * FROM users WHERE name = ?', 'root')->to_query({placeholder => '?'});
```

## Installation

  All you need is Perl 5.20 or newer.

    $ cpanm -n Mojo::SQL

  We recommend the use of a [Perlbrew](http://perlbrew.pl) environment.

