DBI でつないで graphviz する

ファイル名とか画像サイズとかハードコードしてますが、だいたいうごきます。

昔つくった DBIx::Inspector ってやつをつかってます。

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use 5.010000;
use autodie;
use DBI;
use DBIx::Inspector;
use GraphViz;
use Data::Dumper;

my $dbh = DBI->connect(@ARGV);
my $inspector = DBIx::Inspector->new(dbh => $dbh);
my $graph = GraphViz->new( width => 20, height => 5,
                      pagewidth => 25, pageheight => 91);
for my $table ($inspector->tables) {
    say $table->name;
    $graph->add_node($table->name);

    for my $fk ($table->pk_foreign_keys) {
       printf "  %-30s => %s\n", ($fk->fktable_name . '.' . $fk->fkcolumn_name), ($fk->pktable_name .'.'. $fk->pkcolumn_name);
        $graph->add_edge($fk->pktable_name, $fk->fktable_name, label => $fk->fkcolumn_name);
    }
    print "\n";
}

$graph->as_png('out.png');

なお Graphviz::DBI ってのもあるんですが、fk をまともにあつかえないので意味ないです。

関連

Published: 2012-09-06(Thu) 09:52