Voici quelques résultats obtenus avec Dia pour de la modélisation de données (MCD) grâce à autodoc et autodia, voir aussi
ModelizationTools
D'abord, quelques outils de réalisation de schémas techniques.
http://baud123.free.fr/dia/vhffs_20050227_icon.png
outils d'analyse de MCD
Utilisation de shape, clipart
Il est intéressant de reprendre des cliparts (libres) existants, que ce soit Openclipart ou autre :
greffons dia
http://www.cetic.be/internal.php3?id_article=222 ingénierie des exigences dans le domaine du génie logiciel
ajouter des shapes
http://mail.gnome.org/archives/dia-list/2005-November/msg00065.html [en] tout mettre dans sheet
How to Dia
Voir la mailing-list
http://mail.gnome.org/mailman/listinfo/dia-list j'attends
un peu de feedback
FAQ at
http://www.gnome.org/projects/dia/faq.html
Main page at
http://www.gnome.org/projects/dia
Utilisation de
Autodoc et
AutoDia see
http://search.cpan.org/dist/Autodia/ (v2.140 as of 2012-12-15)
Utilisation de AutoDoc
En entrée
L'objectif est de partir d'une base de données PostgreSQL, d'en faire le reverse-engineering pour constituer un MPD et remonter ensuite au MCD.
J'en ai parlé ici aussi :
http://linuxfr.org/~baud123/17259.html
Les traitements
Pour l'instant, j'ai utilisé
Autodoc qui permet de générer du format Dia, dot, HTML, Docbook XML, sachant que je n'ai utilisé (pour l'instant) que la sortie au format Dia. Autodoc s'installe de manière "standard" :
./configure
make
make install # sous root
La base de données PostgreSQL doit être opérationnelle
postgresql_autodoc -d [nom de la base] permet de générer les documentations pour toutes les tables de la base.
A l'ouverture du fichier Dia, toutes les tables sont superposées dans le coin supérieur gauche, il faut les ré-arranger pour sortir un MCD lisible... Pratique, les clés étrangères sont gérées comme contraintes et suivent les déplacements des tables.
Dommage, je n'ai pas trouvé comment remplacer le style des contraintes par des flèches brisées, ce qui permettrait d'avoir une mise en forme plus pratique que la flèche droite... (si quelqu'un a une idée ?)
Il y a de la
http://tedia2sql.tigris.org/usingtedia2sql.html sur l'utilisation du formalisme UML dans Dia.
Les fichiers en sortie
http://baud123.free.fr/dia/vhffs_20050227_icon.png
Utilisation de Autodia
A partir d'une base
MySQL? : (essayer avec du postgres tout de même...)
droogs.org/autodia/ see
http://search.cpan.org/dist/Autodia/
autodia.pl -l DBI -i "mysql:librehwdb:localhost" -U user -P password
A partir d'une base Postgresql, installer libdbd-pg-perl
autodia.pl -l DBI -i "Pg:dbname=vhffs" -U user -P password
Les fichiers en sortie
Dommage les attributs sont extraits mais pas leur type ?!
c'est la version 1.99 qui est en cooker, la version 2.01 est disponible : droogs.org/autodia/download/
http://search.cpan.org/dist/Autodia/ => installé
un peu de hacking de autodia
Je regarde /usr/lib/perl5/site_perl/5.8.6/Autodia/Handler/DBI.pm pour utiliser DBI pour lire les données de type pour chaque attribut...
la version actuelle utilise
my $sth = $dbh->prepare("select * from $esc_table where 1 = 0"); pour voir la liste des champs ! (forcément ya pas le type)
donc j'essaie de regarder plutôt à utiliser
$sth = $dbh->column_info( $catalog, $schema, $table, $column );
J'ai réussi voici le fichier résultant
http://baud123.free.fr/dia/DBI20030327.pm
il y a de la doc' de ce côté :
http://savage.net.au/Perl-modules/html/DBIx/Admin/TableInfo.html encapsulation de tableinfo
http://lists.mysql.com/perl/3392 obtenir le contenu de colonnes
http://coding.derkeiler.com/Archive/Perl/comp.lang.perl.misc/2004-02/0631.html pour récupérer les colonnes
my $dbh = DBI->connect("DBI:$filename", $config{username}, $config{password});
#$sth = $dbh->column_info( $catalog, $schema, $table, $column );
my $sth = $dbh->column_info( '', '', $table, '%' );
my $row = $sth->fetchall_hashref('COLUMN_NAME');
print Dumper ($row) ;
donne :
$VAR1 = {
'date_creation' => {
'DECIMAL_DIGITS' => undef,
'COLUMN_DEF' => undef,
'TABLE_CAT' => undef,
'NUM_PREC_RADIX' => undef,
'TABLE_SCHEM' => 'public',
'BUFFER_LENGTH' => undef,
'CHAR_OCTET_LENGTH' => undef,
'pg_constraint' => undef,
'IS_NULLABLE' => 'YES',
'REMARKS' => undef,
'COLUMN_SIZE' => 8,
'ORDINAL_POSITION' => '3',
'COLUMN_NAME' => 'date_creation',
'TYPE_NAME' => 'timestamp without time zone',
'pg_type' => 'timestamp without time zone',
'NULLABLE' => '1',
'DATA_TYPE' => 93,
'TABLE_NAME' => 'vhffs_object',
'SQL_DATA_TYPE' => undef,
'SQL_DATETIME_SUB' => undef
},
'object_id' => {
'DECIMAL_DIGITS' => undef,
'COLUMN_DEF' => 'nextval(\'seq_id_objects\'::text)',
'TABLE_CAT' => undef,
'NUM_PREC_RADIX' => undef,
'TABLE_SCHEM' => 'public',
'BUFFER_LENGTH' => undef,
'CHAR_OCTET_LENGTH' => undef,
'pg_constraint' => undef,
'IS_NULLABLE' => 'NO',
'REMARKS' => undef,
'COLUMN_SIZE' => 4,
'ORDINAL_POSITION' => '1',
'COLUMN_NAME' => 'object_id',
'TYPE_NAME' => 'integer',
'pg_type' => 'integer',
'NULLABLE' => '0',
'DATA_TYPE' => 4,
'TABLE_NAME' => 'vhffs_object',
'SQL_DATA_TYPE' => undef,
'SQL_DATETIME_SUB' => undef
},
'description' => {
'DECIMAL_DIGITS' => undef,
'COLUMN_DEF' => undef,
'TABLE_CAT' => undef,
'NUM_PREC_RADIX' => undef,
'TABLE_SCHEM' => 'public',
'BUFFER_LENGTH' => undef,
'CHAR_OCTET_LENGTH' => undef,
'pg_constraint' => undef,
'IS_NULLABLE' => 'YES',
'REMARKS' => undef,
'COLUMN_SIZE' => 500,
'ORDINAL_POSITION' => '5',
'COLUMN_NAME' => 'description',
'TYPE_NAME' => 'character varying',
'pg_type' => 'character varying(500)',
'NULLABLE' => '1',
'DATA_TYPE' => 12,
'TABLE_NAME' => 'vhffs_object',
'SQL_DATA_TYPE' => undef,
'SQL_DATETIME_SUB' => undef
},
'state' => {
'DECIMAL_DIGITS' => undef,
'COLUMN_DEF' => undef,
'TABLE_CAT' => undef,
'NUM_PREC_RADIX' => undef,
'TABLE_SCHEM' => 'public',
'BUFFER_LENGTH' => undef,
'CHAR_OCTET_LENGTH' => undef,
'pg_constraint' => undef,
'IS_NULLABLE' => 'NO',
'REMARKS' => undef,
'COLUMN_SIZE' => undef,
'ORDINAL_POSITION' => '4',
'COLUMN_NAME' => 'state',
'TYPE_NAME' => 'character varying',
'pg_type' => 'character varying',
'NULLABLE' => '0',
'DATA_TYPE' => 12,
'TABLE_NAME' => 'vhffs_object',
'SQL_DATA_TYPE' => undef,
'SQL_DATETIME_SUB' => undef
},
'owner_uid' => {
'DECIMAL_DIGITS' => undef,
'COLUMN_DEF' => undef,
'TABLE_CAT' => undef,
'NUM_PREC_RADIX' => undef,
'TABLE_SCHEM' => 'public',
'BUFFER_LENGTH' => undef,
'CHAR_OCTET_LENGTH' => undef,
'pg_constraint' => undef,
'IS_NULLABLE' => 'NO',
'REMARKS' => undef,
'COLUMN_SIZE' => 4,
'ORDINAL_POSITION' => '2',
'COLUMN_NAME' => 'owner_uid',
'TYPE_NAME' => 'integer',
'pg_type' => 'integer',
'NULLABLE' => '0',
'DATA_TYPE' => 4,
'TABLE_NAME' => 'vhffs_object',
'SQL_DATA_TYPE' => undef,
'SQL_DATETIME_SUB' => undef
}
};
cool pour naviguer dans cette structure, il "suffit" :
foreach my $field (keys %$row ) {
print "$field $row->{$field}->{TYPE_NAME}\n"
}
En MySQL, la fonction tables renvoit les tables avec des backquotes, par exemple `hw_types`, forcément ya DBI::mysql qui râle
DBD::mysql::db column_info failed: column_info doesn't support table wildcard at /usr/lib/perl5/site_perl/5.8.6/Autodia/Handler/DBI.pm line 87.
Can't call method "fetchall_hashref" on an undefined value at /usr/lib/perl5/site_perl/5.8.6/Autodia/Handler/DBI.pm line 88.
donc, il faut enlever les backquotes :
if ($unescape_tablenames) { $table =~ s/\`//g ; }
my $dbh = DBI->connect("DBI:$filename", $config{username}, $config{password});
my $escape_tablenames = 0; my $unescape_tablenames=0;
my $database_type = $dbh->get_info( 17 );
print "database type : $database_type\n";
$escape_tablenames = 1 if (lc($database_type) =~ m/(oracle|postgres|PostgreSQL)/);
$unescape_tablenames = 1 if (lc($database_type) =~ m/(mysql)/);
my %tables = map { $_ => 1 } $dbh->tables();
foreach my $table (keys %tables) {
if ($unescape_tablenames) { $table =~ s/\`//g ; }
my $sth = $dbh->column_info( undef, undef, $table, '%' );
my $row = $sth->fetchall_hashref('COLUMN_NAME');
foreach my $field (keys %$row ) {
print "$field $row->{$field}->{TYPE_NAME}\n";
}
} # foreach my $table