The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

SQL::Format - Yet another yet another SQL builder

SYNOPSIS

use SQL::Format;

my ($stmt, @bind) = sqlf 'SELECT %c FROM %t WHERE %w' => (
    [qw/bar baz/], # %c
    'foo',         # %t
    {
        hoge => 'fuga',
        piyo => [qw/100 200 300/],
    },             # %w
);
# $stmt: SELECT `bar`, `baz` FROM `foo` WHERE (`hoge` = ?) AND (`piyo` IN (?, ?, ?))
# @bind: ('fuga', 100, 200, 300);

($stmt, @bind) = sqlf 'SELECT %c FROM %t WHERE %w %o' => (
    '*',                # %c
    'foo',              # %t
    { hoge => 'fuga' }, # w
    {
        order_by => { bar => 'DESC' },
        limit    => 100,
        offset   => 10,
    },                  # %o
);
# $stmt: SELECT * FROM `foo` WHERE (`hoge` = ?) ORDER BY `bar` DESC LIMIT 100 OFFSET 10
# @bind: (`fuga`)

($stmt, @bind) = sqlf 'UPDATE %t SET %s' => (
    foo => { bar => 'baz', 'hoge => 'fuga' },
);
# $stmt: UPDATE `foo` SET `bar` = ?, `hoge` = ?
# @bind: ('baz', 'fuga')

my $sqlf = SQL::Format->new(
    quote_char    => '',        # do not quote
    limit_dialect => 'LimitXY', # mysql style limit-offset
);
($stmt, @bind) = $sqlf->select(foo => [qw/bar baz/], {
    hoge => 'fuga',
}, {
    order_by => 'bar',
    limit    => 100,
    offset   => 10,
});
# $stmt: SELECT bar, baz FROM foo WHERE (hoge = ?) ORDER BY bar LIMIT 10, 100
# @bind: ('fuga')

($stmt, @bind) = $sqlf->insert(foo => { bar => 'baz', hoge => 'fuga' });
# $stmt: INSERT INTO foo (bar, hoge) VALUES (?, ?)
# @bind: ('baz', 'fuga')

($stmt, @bind) = $sqlf->update(foo => { bar => 'xxx' }, { hoge => 'fuga' });
# $stmt: UPDATE foo SET bar = ? WHERE hoge = ?
# @bind: ('xxx', 'fuga')

($stmt, @bind) = $sqlf->delete(foo => { hoge => 'fuga' });
# $stmt: DELETE FROM foo WHERE (hoge = ?)
# @bind: ('fuga')

DESCRIPTION

SQL::Format is a easy to SQL query building library.

THIS MODULE IS ALPHA LEVEL INTERFACE!!

FUNCTIONS

sqlf($format, @args)

Generate SQL from formatted output conversion.

my ($stmt, @bind) = sqlf 'SELECT %c FROM %t WHERE %w' => (
    [qw/bar baz/],   # %c
    'foo',           # %t
    {
        hoge => 'fuga',
        piyo => [100, 200, 300],
    },               # %w
);
# $stmt: SELECT `foo` FROM `bar`, `baz WHERE (`hoge` = ?) AND (`piyo` IN (?, ?, ?))
# @bind: ('fuga', 100, 200, 300)

Currently implemented formatters are:

For more examples, see also SQL::Format::Spec.

You can change the behavior by changing the global variable.

METHODS

new([%options])

Create a new instance of SQL::Format.

my $sqlf = SQL::Format->new(
    quote_char    => '',
    limit_dialect => 'LimitXY',
);

%options specify are:

format($format, \%args)

This method same as sqlf function.

my ($stmt, @bind) = $self->format('SELECT %c FROM %t WHERE %w',
    [qw/bar baz/],
    'foo',
    { hoge => 'fuga' },
);
# $stmt: SELECT `bar`, `baz` FROM ` foo` WHERE (`hoge` = ?)
# @bind: ('fuga')

select($table|\@table, $column|\@columns [, \%where, \%opts ])

This method returns SQL string and bind parameters for SELECT statement.

my ($stmt, @bind) = $sqlf->select(foo => [qw/bar baz/], {
    hoge => 'fuga',
    piyo => [100, 200, 300],
});
# $stmt: SELECT `foo` FROM `bar`, `baz` WHERE (`hoge` = ?) AND (`piyo` IN (?, ?, ?))
# @bind: ('fuga', 100, 200, 300)

Argument details are:

insert($table, \%values|\@values [, \%opts ])

This method returns SQL string and bind parameters for INSERT statement.

my ($stmt, @bind) = $sqlf->insert(foo => { bar => 'baz', hoge => 'fuga' });
# $stmt: INSERT INTO `foo` (`bar`, `hoge`) VALUES (?, ?)
# @bind: ('baz', 'fuga')

my ($stmt, @bind) = $sqlf->insert(foo => [
    hoge => \'NOW()',
    fuga => \['UNIX_TIMESTAMP()', '2012-12-12 12:12:12'],
]);
# $stmt: INSERT INTO `foo` (`hoge`, `fuga`) VALUES (NOW(), UNIX_TIMESTAMP(?))
# @bind: ('2012-12-12 12:12:12')

Argument details are:

update($table, \%set|\@set [, \%where, \%opts ])

This method returns SQL string and bind parameters for UPDATE statement.

my ($stmt, @bind) = $sqlf->update(foo => { bar => 'baz' }, { hoge => 'fuga' });
# $stmt: UPDATE `foo` SET `bar` = ? WHERE (`hoge` = ?)
# @bind: ('baz', 'fuga')

Argument details are:

delete($table [, \%where, \%opts ])

This method returns SQL string and bind parameters for DELETE statement.

my ($stmt, @bind) = $sqlf->delete(foo => { bar => 'baz' });
# $stmt: DELETE FROM `foo` WHERE (`bar = ?)
# @bind: ('baz')

Argument details are:

insert_multi($table, \@cols, \@values [, \%opts])

This method returns SQL string and bind parameters for bulk insert.

my ($stmt, @bind) = $self->insert_multi(
    foo => [qw/bar baz/],
    [
        [qw/hoge fuga/],
        [qw/fizz buzz/],
    ],
);
# $stmt: INSERT INTO `foo` (`bar`, `baz`) VALUES (?, ?), (?, ?)
# @bind: (qw/hoge fuga fizz buzz/)

Argument details are:

insert_multi_from_hash($table, \@values [, \%opts])

This method is a wrapper for insert_multi().

Argument dialects are:

insert_on_duplicate($table, \%values|\@values, \%update_values|\@update_values [, \%opts])

This method generate "INSERT INTO ... ON DUPLICATE KEY UPDATE" query for MySQL.

my ($stmt, @bind) = $sqlf->insert_on_duplicate(
    foo => {
        bar => 'hoge',
        baz => 'fuga',
    }, {
        bar => \'VALUES(bar)',
        baz => 'piyo',
    },
);
# $stmt: INSERT INTO `foo` (`bar`, `baz`) VALUES (?, ?) ON DUPLICATE KEY UPDATE `bar` = VALUES(bar), baz = 'piyo'
# @bind: (qw/hoge fuga piyo/)

Argument details are:

AUTHOR

xaicron

COPYRIGHT

Copyright 2012 - xaicron

LICENSE

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

SEE ALSO

SQL::Format::Spec

SQL::Maker

SQL::Abstract