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 访问此网上论坛。
<<tmp.1sKZjd1d4L.png>>
