SQL::Translator 一个以SQL为中心的转换工具,可以实现SQL<->Schema, SQL<->Database, SQL<->ER等各种转换。
CPAN文档:http://search.cpan.org/~kclark/SQL-Translator-0.07/lib/SQL/Translator.pm
producer 将SQL::Translator的中间对象(schema)输出为各种不同的目的对象。
传入一个参数。$tr 为SQL::Translator对象。
parser 将输入数据,转换为SQL::Translator. 在parser调用时传入两个参数。
$tr 一个SQL::Translator 实例.
$data 要解析的数据,传入方式为: $t->translate( $input ) 注,$t为SQL::Translator对象。
SQL::Translator::Schema 中间对象类。
http://search.cpan.org/~kclark/SQL-Translator-0.07/lib/SQL/Translator/Schema.pm
使用SQL::Translator实现xml配置文件到数据模型的转换。
1.可以根据业务进行建模分析数据模型以xml方式保存,
2.将xml文件转换为DBIx::Class的schema文件。*
3.将xml文件转换为sql script。
xml如下:
问题:怎么实现xml->到schema的转换。因为输入后的xml将转换为中间对象(schema)。在输入的时候只能以中间对象(schema)为基础,不能记录之前的xml文件名。这样将不能实现同一个表在多个xml配置使用的情况。
关于SQL::Translator的设计。
1. 可以用于一些数据转换程序的设计。设计核心是定义一个完善的中间对象。中间对象的设计的好坏,直接影响到程序的扩展性。一方提供一个将源数据转换到中间对象,另一方提供一个接口将数中间对象转化为目的数据。
2.由于引入了中间对象,以结构体组织数据,比直接转换更简单。
CPAN文档:http://search.cpan.org/~kclark/SQL-Translator-0.07/lib/SQL/Translator.pm
SQL
::
Translator包的方法列表:
* add_drop_table
* no_comments
* producer
* parser
* filters
* show_warnings
* translate
* filename , data
* schema
* trace
* validate
* version
* add_drop_table
* no_comments
* producer
* parser
* filters
* show_warnings
* translate
* filename , data
* schema
* trace
* validate
* version
producer 将SQL::Translator的中间对象(schema)输出为各种不同的目的对象。
传入一个参数。$tr 为SQL::Translator对象。
sub
produce {
my $tr = shift ;
my $schema = $tr -> schema; # 取得schema对象。然后解析输出。schema的数据由parser构建.
my $output = '' ;
for my $t ( $schema -> get_tables ) {
$output .= join ( '' , " Table = " , $t -> name , " " );
}
return $output ;
}
my $tr = shift ;
my $schema = $tr -> schema; # 取得schema对象。然后解析输出。schema的数据由parser构建.
my $output = '' ;
for my $t ( $schema -> get_tables ) {
$output .= join ( '' , " Table = " , $t -> name , " " );
}
return $output ;
}
parser 将输入数据,转换为SQL::Translator. 在parser调用时传入两个参数。
$tr 一个SQL::Translator 实例.
$data 要解析的数据,传入方式为: $t->translate( $input ) 注,$t为SQL::Translator对象。
sub
parser {
my ( $tr , $data ) = @_ ;
my $schema = $tr -> schema; # 从$tr取得schema对象,让后把解析后的数据,填入schema对象等待producer转换。
for my $line ( split ( / n /, $data ) ) {
my ( $table_name , @fields ) = split ( /:/, $line );
my $table = $schema -> add_table( name => $table_name )
or die $schema -> error;
for ( @fields ) {
my ( $f_name , $type , $size ) = split ;
$table -> add_field(
name => $f_name ,
data_type => $type ,
size => $size ,
) or die $table -> error;
}
}
return 1 ;
}
my ( $tr , $data ) = @_ ;
my $schema = $tr -> schema; # 从$tr取得schema对象,让后把解析后的数据,填入schema对象等待producer转换。
for my $line ( split ( / n /, $data ) ) {
my ( $table_name , @fields ) = split ( /:/, $line );
my $table = $schema -> add_table( name => $table_name )
or die $schema -> error;
for ( @fields ) {
my ( $f_name , $type , $size ) = split ;
$table -> add_field(
name => $f_name ,
data_type => $type ,
size => $size ,
) or die $table -> error;
}
}
return 1 ;
}
SQL::Translator::Schema 中间对象类。
http://search.cpan.org/~kclark/SQL-Translator-0.07/lib/SQL/Translator/Schema.pm
使用SQL::Translator实现xml配置文件到数据模型的转换。
1.可以根据业务进行建模分析数据模型以xml方式保存,
2.将xml文件转换为DBIx::Class的schema文件。*
3.将xml文件转换为sql script。
xml如下:
profile.xml
< node table ="profile" >
< string name ="name" />
< string name ="password" />
</ node >
password.xml
< node table ="profile" >
< string name ="password" />
</ node >
< node table ="profile" >
< string name ="name" />
< string name ="password" />
</ node >
password.xml
< node table ="profile" >
< string name ="password" />
</ node >
问题:怎么实现xml->到schema的转换。因为输入后的xml将转换为中间对象(schema)。在输入的时候只能以中间对象(schema)为基础,不能记录之前的xml文件名。这样将不能实现同一个表在多个xml配置使用的情况。
关于SQL::Translator的设计。
1. 可以用于一些数据转换程序的设计。设计核心是定义一个完善的中间对象。中间对象的设计的好坏,直接影响到程序的扩展性。一方提供一个将源数据转换到中间对象,另一方提供一个接口将数中间对象转化为目的数据。
2.由于引入了中间对象,以结构体组织数据,比直接转换更简单。