使用DdlUtils和Ant进行不同数据库之间schema和data的转换


在开发过程中常常要用到多种数据库类型,比如项目可能需要支持Oracle, MySQL, MSSQL Server, Derby等等。已经有很多各种各样的小工具可以帮助开发人员进行数据库之间的schema、data转换与同步,DdlUtils 就是其中之一。它可以结合Ant或者程序代码进行数据库schema/data和xml文件的相互转换。

例如,项目开发支持的是MySQL,而为了单元测试的整洁和方便,开发人员决定使用Derby来支持单元测试。DdlUtils就可以把schema和数据从MySQL中导出,变成xml文件,然后根据需要导入到Derby中;反之亦可。显然,这些导出的xml文件也是对于数据库的一个很好的备份。

下面是apache ddlutils官网给出的一个xml的例子,table和column标签里面支持的child和attribute远不止示例中的这些。

  1. <?xml version="1.0"?>  
  2. <!DOCTYPE database SYSTEM "http://db.apache.org/torque/dtd/database.dtd">  
  3. <database name="testdb">  
  4.   <table name="author">  
  5.     <column name="author_id"  
  6.             type="INTEGER"  
  7.             primaryKey="true"  
  8.             required="true"/>  
  9.     <column name="name"  
  10.             type="VARCHAR"  
  11.             size="50"  
  12.             required="true"/>  
  13.     <column name="organisation"  
  14.             type="VARCHAR"  
  15.             size="50"  
  16.             required="false"/>  
  17.   </table>  
  18.   
  19.   <table name="book">  
  20.     <column name="book_id"  
  21.             type="INTEGER"  
  22.             required="true"  
  23.             primaryKey="true"  
  24.             autoIncrement="true"/>  
  25.     <column name="isbn"  
  26.             type="VARCHAR"  
  27.             size="15"  
  28.             required="true"/>  
  29.     <column name="author_id"  
  30.             type="INTEGER"  
  31.             required="true"/>  
  32.     <column name="title"  
  33.             type="VARCHAR"  
  34.             size="255"  
  35.             defaultValue="N/A"  
  36.             required="true"/>  
  37.   
  38.     <foreign-key foreignTable="author">  
  39.       <reference local="author_id" foreign="author_id"/>  
  40.     </foreign-key>    
  41.   
  42.     <index name="book_isbn">  
  43.       <index-column name="isbn"/>  
  44.     </index>  
  45.   </table>  
  46. </database>  

DdlUtils包含了3个Ant Task,分别是databaseToDdl, ddlToDatabase以及dumpMetadata。

使用ddlToDatabase的示例:

这个Ant任务创建了一个PostgreSQL数据库,把xml中定义的schema和data导入到数据库中。

  1. <path id="runtime-classpath">  
  2.   <fileset dir="lib">  
  3.     <include name="**/*.jar"/>  
  4.     <include name="**/*.zip"/>  
  5.   
  6.   </fileset>  
  7. </path>  
  8.   
  9.   
  10. <target name="database-setup"  
  11.         description="Creates the database structure and inserts data into the database">  
  12.   <taskdef name="ddlToDatabase"  
  13.            classname="org.apache.ddlutils.task.DdlToDatabaseTask">  
  14.     <classpath refid="runtime-classpath"/>  
  15.   </taskdef>  
  16.   
  17.   <ddlToDatabase>  
  18.     <database url="jdbc:postgresql://localhost/test"  
  19.               driverClassName="org.postgresql.Driver"  
  20.               username="someuser"  
  21.               password="somepassword"/>  
  22.     <fileset dir="src/schema">  
  23.       <include name="project-schema.xml"/>  
  24.     </fileset>  
  25.   
  26.     <createDatabase failonerror="false"/>  
  27.   
  28.     <writeSchemaToDatabase/>   
  29.     <writeDataToDatabase datafile="src/data/data.xml"/>   
  30.   </ddlToDatabase>  
  31. </target>  

使用databaseToDdl的示例:

这个Ant任务把derby数据库中的schema和data导出到xml文件中。

  1. <path id="runtime-classpath">  
  2.   <fileset dir="lib">  
  3.     <include name="**/*.jar"/>  
  4.   
  5.     <include name="**/*.zip"/>  
  6.   </fileset>  
  7. </path>  
  8.   
  9. <target name="database-dump" description="Dumps the database structure">  
  10.   <taskdef name="databaseToDdl"  
  11.            classname="org.apache.ddlutils.task.DatabaseToDdlTask">  
  12.     <classpath refid="runtime-classpath"/>  
  13.   
  14.   </taskdef>  
  15.   <databaseToDdl modelName="MyModel">  
  16.     <database url="jdbc:derby:ddlutils"  
  17.               driverClassName="org.apache.derby.jdbc.EmbeddedDriver"  
  18.               username=""  
  19.               password=""/>  
  20.   
  21.     <writeSchemaToFile outputFile="db-schema.xml"/>  
  22.     <writeDataToFile outputFile="data.xml"/>  
  23.   </databaseToDdl>  
  24.   
  25. </target>  

相关内容