Takuji->find;

株式会社はてなでアプリケーションエンジニアやってます、技術的な記事を書いているつもり

DBIx::InspectorでTengのSchemaを生成する

久々に書いてみる

開発中のアプリでTeng使ってみようと考えたので簡単にSchema生成スクリプト書いてみた

_atがある前提だったり主キーは必ず1つだったり制約多い書き方だけどまぁ普通に使えるんじゃないかと思ってる

#! /usr/bin/env perl
use strict;
use warnings;

use DBIx::Inspector;
use lib './lib';

use Wagayatei::DB;
use Data::Section::Simple;
use Text::Xslate;
use Teng::Schema;
use Path::Class qw(dir);

my $dbi = Wagayatei::DB->get_dbi;

my $inspector = DBIx::Inspector->new( dbh => $dbi );
my $tables = [$inspector->tables()];

my $xslate = Text::Xslate->new(
    path => Data::Section::Simple->new->get_data_section,
);

my $schema = $xslate->render('schema',{ tables => $tables, camelize => \&Teng::Schema::camelize });

my $path = dir('./')->subdir('lib/Wagayatei/DB/');
$path->mkpath;
my $fh = $path->file('Schema.pm')->openw;
print $fh $schema;
close $fh;

1;
__DATA__
@@ schema
#XXX GENERATED BY generate_schema.pl
package  Wagayatei::DB::Schema;
use Chiffon::Core;

use Teng::Schema::Declare;
use Time::Piece::MySQL;

:for $tables -> $table {
    table{
        name '<: $table.name() :>';
        pk '<: $table.primary_key().next().name() :>';
        columns qw(
        :my $columns = $table.columns()
        :while $columns.next() -> $column {
            <: $column.name() :>
        :}
        );
        inflate qr/_at$/ => sub {
            Time::Piece->from_mysql_datetime(shift);
        };
        deflate qr/_at$/ => sub {
            shift->mysql_datetime;
        };
        row_class 'Wagayatei::Model::<: $camelize($table.name()) :>';
    };
:}

1;