end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

db schema(DDL)の資料作成なら、SQL::Translator で自動作成しては?

私の周りでは、多くが
1)excelでDB設計書 (テーブル定義) を書いて、
2)create table 等をschema_ddl.sql のようなもの(DDL)を書いて
3)DBを構築
していますが、

どうせ schema_ddl.sql を書くのであれば、次のように SQL::Translator で 1)に該当する資料を作成してもいい気がします。

【step 1】db schemaをsqlで書きましょう

※COMMENTキーワードで説明も書きましょう

CREATE TABLE 内緒_setup_src (
  内緒_id int(11) NOT NULL DEFAULT '0' COMMENT '内緒ID',
  filename varchar(64) NOT NULL DEFAULT '',
  setup text,
  start_time timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  end_time timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  update_time timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (juuko_id,filename,start_time)
) ENGINE=InnoDB
  DEFAULT CHARSET=utf8
  COMMENT='内緒の\nセットアップ情報です'

【step 2】SQL::Translator でdb schemaをHTMLに変換してみましょう

すると、↓こんな感じ ※出力形式は、yaml等もあります

【その他】既にあるDBの仕様書をHTMLで作成するなら↓こんな感じ

#!/usr/local/bin/perl
use strict;
use DBI;
use Encode;
use SQL::Translator;
use Data::Dumper;

my $CONV_HTML_CHARSET_ORG = 'content="text/html; charset=iso-8859-1"';
my $CONV_HTML_CHARSET_NEW = 'content="text/html; charset=utf8"';

main();

sub main {
    my $dbh = connect_db();

    my $tr = SQL::Translator->new();
    #対象のdbms
    $tr->parser("SQL::Translator::Parser::MySQL");

    #parse結果の出力形式
    $tr->producer("SQL::Translator::Producer::HTML");
#    $tr->producer("SQL::Translator::Producer::YAML");

    #dbにある全てのtable nameを取得しましょう
    my $tbl_names = get_all_table_names($dbh);

    my $table_info = "";

    for my $tbl ( @$tbl_names ){
	my $sql = "show create table $tbl";
	my $sth = $dbh->prepare($sql);

	#対象テーブルがviewだと、execute()でエラーになります
        #mysqlでのテーブルorビューの判定は、INFORMATION_SCHEMA.TABLESでも可
        if( $sth->execute() ){
	    my $ret_tmp = $sth->fetchrow_arrayref();
	    if(ref($ret_tmp) eq 'ARRAY' and @$ret_tmp>0){
		$table_info .= $ret_tmp->[1] .";\n\n";
	    }
	}

    }

    $tr->parser->($tr, $table_info);
    my $output = $tr->producer->($tr);
    $output =~ s/\\n/<br>/o;
    $output =~ s/$CONV_HTML_CHARSET_ORG/$CONV_HTML_CHARSET_NEW/o;

    print $output;
}


sub get_all_table_names {
    my ($dbh) = @_;
    my $sql=<<EOF;
show tables;
EOF
    my $sth = $dbh->prepare($sql);
    $sth->execute();
    my @table_names;
    while (my $table_name = $sth->fetchrow_array() ){
        push(@table_names, $table_name);
    }
    return \@table_names;
}

sub connect_db {
    my $dbh = DBI->connect("DBI:mysql:database=test;host=localhost",
                           "root",
                           "");
    $dbh->do("SET NAMES utf8") or
        die "cannot set encoding";
    return $dbh;
}

私の場合、「excel仕様書書く」→「db schemaをsqlで書く」→「DBに適用する」よりも、この方が好き

mysqlでのテーブルorビューの判定は、INFORMATION_SCHEMA.TABLESで

http://dev.mysql.com/doc/refman/5.1/en/tables-table.html
↑ここに書いてあるとおりですが、次のsqlで区別できます。

SELECT table_name, table_type FROM INFORMATION_SCHEMA.TABLES
  WHERE table_schema = 'test_db' and table_name LIKE 'test_table';
+------------+------------+
| table_name | table_type |
+------------+------------+
| test_table | VIEW       |
+------------+------------+
1 row in set (0.00 sec)