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

NAME

DBIx::Schema::DSL - DSL for Database schema declaration

VERSION

This document describes DBIx::Schema::DSL version 0.10.

SYNOPSIS

    # declaration
    package My::Schema;
    use DBIx::Schema::DSL;

    database 'MySQL';              # optional. default 'MySQL'
    create_database 'my_database'; # optional

    # Optional. Default values is same as follows if database is 'MySQL'.
    add_table_options
        'mysql_table_type' => 'InnoDB',
        'mysql_charset'    => 'utf8';

    create_table 'book' => columns {
        integer 'id',   primary_key, auto_increment;
        varchar 'name', null;
        integer 'author_id';
        decimal 'price', 'size' => [4,2];

        add_index 'author_id_idx' => ['author_id'];

        belongs_to 'author';
    };

    create_table 'author' => columns {
        primary_key 'id';
        varchar 'name';
        decimal 'height', 'precision' => 4, 'scale' => 1;

        add_index 'height_idx' => ['height'];

        has_many 'book';
    };

    1;

    # use your schema class like this
    # use My::Schema;
    # print My::Schema->output; # output DDL

DESCRIPTION

This module provides DSL for database schema declaration like ruby's ActiveRecord::Schema.

THE SOFTWARE IS IT'S IN ALPHA QUALITY. IT MAY CHANGE THE API WITHOUT NOTICE.

INTERFACE

Export Functions

database($str :Str)

Set database type like MySQL, Oracle and so on. (Optional default 'MySQL')

create_database($str :Str)

Set database name. (Optional)

add_table_options(%opt :Hash)

Set global setting of table->extra for SQL::Translator::Table

default_unsigned()

Automatically set unsigned when declaring integer columns. If you want to declare singed columns, using `singed` sugar.

default_not_null()

Automatically set not null. If you want to declare null columns, using `null` sugar.

create_table($table_name :Str, $columns :CodeRef)

Declare table.

columns { block } :CodeRef

Declare columns settings of table in block. In fact columns {...} is mostly same as sub {...}, so just syntax sugar.

Export Functions for declaring column

column($column_name :Str, $data_type :Str(DataType), (%option :Optional))

Declare column. It can be called only in create_table block.

$data_type strings (ex. integer ) are can be used as a function.

integer($column_name, (%option)) is same as column($column_name, (%option))

DataType functions are as follows.

bigint
binary
bit
blob
char
date
datetime
dec
decimal
double
integer
number
numeric
smallint
string
text
timestamp
tinyblob
tinyint
varbinary
varchar

primary_key($column_name :Str, (%option :Optional))

Same as column($column_name, 'integer', primary_key => 1, auto_increment => 1, (%option))

pk($column_name :Str, (%option :Optional))

Alias of primary_key .

%option arguments

Specify column using %option hash.

    integer 'id', primary_key => 1, default => 0;

Each keyword has mapping to argument for SQL::Translator::Field.

mappings are:

    null           => 'is_nullable',
    size           => 'size',
    limit          => 'size',
    default        => 'default_value',
    unique         => 'is_unique',
    primary_key    => 'is_primary_key',
    auto_increment => 'is_auto_increment',
    unsigned       => {extra => {unsigned => 1}},
    precisition    => 'size[0]',
    scale          => 'size[1]',

Syntax sugars for %option

There are syntax sugar functions for %option.

primary_key()
    ('primary_key' => 1)
pk()

Alias of primary_key.

unique()
    ('unique' => 1)
auto_increment()
    ('auto_increment' => 1)
unsigned()
    ('unsigned' => 1)
signed()
    ('unsigned' => 0)
null()
    ('null' => 1)
not_null()
    ('null' => 0)

Export Functions for declaring primary_key and indices

set_primary_key(@columns)

Set primary key. This is useful for multi column primary key. Do not need to call this function when primary_key column already declared.

add_index($index_name :Str, $colums :ArrayRef, ($index_type :Str(default 'NORMAL')) )

Add index.

add_unique_index($index_name :Str, $colums :ArrayRef)

Same as add_index($index_name, $columns, 'UNIQUE')

Export Functions for declaring foreign keys

foreign_key($columns :(Str|ArrayRef), $foreign_table :Str, $foreign_columns :(Str|ArrayRef) )

Add foreign key.

fk(@_)

Alias of foreign_key(@_)

Foreign key sugar functions

has_many($foreign_table)
has_one($foreign_table)
belongs_to($foreign_table)

Export Class Methods

output() :Str

Output schema DDL.

no_fk_output() :Str

Output schema DDL without FOREIGN KEY constraints.

translate_to($database_type :Str) :Any

Output schema DDL of $database_type.

translator() :SQL::Translator

Returns SQL::Translator object.

context() :DBIx::Schema::DSL::Context

DEPENDENCIES

Perl 5.8.1 or later.

BUGS

All complex software has bugs lurking in it, and this module is no exception. If you find a bug please either email me, or add the bug to cpan-RT.

SEE ALSO

perl

AUTHOR

Masayuki Matsuki <y.songmu@gmail.com>

LICENSE AND COPYRIGHT

Copyright (c) 2013, Masayuki Matsuki. All rights reserved.

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