Thanks for that.
http://perlchina.github.com/advent.perlchina.org/2011/db-layout-graphviz.html


2011/12/12 joe jiang <[email protected]>

> Sorry a mistake at copy paste, please replace DB<1> with this:
>
>   DB<1> use GraphViz::DBI; sub GraphViz::DBI::is_foreign_key { return
> qq(`employees`.`$_->{REFERENCED_TABLE_NAME}`) for
> @{$_[0]->{dbh}->selectall_arrayref(q{select REFERENCED_TABLE_NAME,
> REFERENCED_COLUMN_NAME from information_schema.key_column_usage where
> REFERENCED_COLUMN_NAME=? and COLUMN_NAME=? and TABLE_SCHEMA=? and
> TABLE_NAME=?}, {Slice => {}}, $_[2], $_[2], $_[1]=~m{(\w+)\W+(\w+)})} }
>
>
> 2011/12/12 joe jiang <[email protected]>
>
>> =for advent_day 11
>>
>> =for advent_title GraphViz::DBI::mysql
>>
>> =for advent_author Joe Jiang
>>
>> 其实这还不是一个真正可用的模块,这里的名字只是预备将来发布的,所以请各位看官大家
>> 手下留情,先不要注册掉它。
>>
>> GraphViz::DBI 是一个基于 GraphViz 的模块,目标是用来进行数据库 ER 图的绘制,可以
>> 输出的格式非常多,这里用 PNG 格式来举例。
>>
>> 要使用这个模块,首先要有一个可用的数据库 DBI
>> 连接。然后要覆盖这个模块的外键参考依赖子程序,这样才能从特定数据库获取元数据。最后,还要用这个修正过的模块来输出图
>> 片。
>>
>> 这里的 MySQL 数据库使用了样本数据库 employees,可以在网上下载
>> https://launchpad.net/test-db/employees-db-1。这里假定样本数据库已经创建并导入,并且用 DBI 登录
>> MySQL 的问题已经解决。
>>
>> 第一步,启动 Perl 调试器(perl -de 0),载入并修正 GraphViz::DBI:
>>
>> =begin code
>>
>>   DB<1> use GraphViz::DBI; sub GraphViz::DBI::is_foreign_key { return
>> qq(`employees`.`@{[$_[0]->{dbh}->selectall_arrayref(q{select
>> REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME from
>> information_schema.key_column_usage where REFERENCED_COLUMN_NAME=? and
>> COLUMN_NAME=? and TABLE_SCHEMA=? and TABLE_NAME=?}, {Slice => {}}, $_[2],
>> $_[2], $_[1]=~m{(\w+)\W+(\w+)})->[0]->{REFERENCED_TABLE_NAME}]}`) }
>>
>> =end code
>>
>> 这里通过查询了 MySQL 的元数据
>> information_schema.key_column_usage,从其中查找某个表的字段是否有参考的主表,若查询结果不为空的话,就返回表名作为结果,否则返回空
>> 。
>>
>> 第二步,创建数据库连接,这里要求用户能够不用密码登录,且获得了查询 information_schema 的权限:
>>
>> =begin code
>>
>>   DB<2> use DBI; $d=DBI->connect(q(DBI:mysql:database=employees), q(),
>> q())
>>
>> =end code
>>
>> 第三步,命名临时文件,并正式驱动模块生成图片:
>>
>> =begin code
>>
>>   DB<3> x open F, q(>), q(tmp.1sKZjd1d4L.png); print F
>> GraphViz::DBI->new($d)->graph_tables->as_png
>>
>> =end code
>>
>> 欢迎尝试其他数据库,效果应该还不错 :)
>> [image: tmp.1sKZjd1d4L.png]
>>
>
>  --
> 您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
> 要向此网上论坛发帖,请发送电子邮件至 [email protected]。
> 要取消订阅此网上论坛,请发送电子邮件至 [email protected]。
> 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
>



-- 
Fayland Lam // http://www.fayland.org/

-- 
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 [email protected]。
要取消订阅此网上论坛,请发送电子邮件至 [email protected]。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

<<tmp.1sKZjd1d4L.png>>

回复