私の周りでは、多くが
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セットアップ情報です'
【その他】既にある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; }
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)