Readers: 57 | Updated: 06-24

使用maven-sql-plugin实现持续数据库集成(CDBI)

Translate Into:

作者: juvenshun  链接:http://juvenshun.javaeye.com/blog/207326  发表时间: 2008年06月24日

声明:本文系JavaEye网站发布的原创博客文章,未经作者书面许可,严禁任何网站转载本文,否则必将追究法律责任!

数据库持续集成(Continuous Database Integration, CDBI)是持续集成(Continuous Ingeration, CI)不可或缺的重要组成部分。在典型的情况下,版本控制系统管理数据库脚本,包括数据库定义语言(DDL)和数据库操纵语言(DML)。开发成员在开发过程中添加或者修改数据库脚本,在本地运行过之后,提交至版本控制系统,并由此激发一次持续构建。CI服务器执行数据库脚本,并返回成功或者错误报告。

 

第18界Jolt大奖,技术类图书获得者: Continuous Integration: Improving Software Quality and Reducing Risk 用一章的篇幅介绍的CDBI的相关概念及实践,并给出了一个基于Ant的样例实现,本文将介绍使用Maven来实现CDBI。

 

首先简单介绍一下 SQL Maven Plugin ,它通过Maven来执行配置好的数据库脚本,可以通过在POM中配置sql命令,或者将脚本写在文件中,在POM中配置文件位置。最后,运行 mvn sql:execute 以执行所有脚本。

 

以下通过一个比较完整的例子来解释下该插件的用法,这里例子能在这里找到:http://mojo.codehaus.org/sql-maven-plugin/examples/execute.html

 

首先,配置对 sql-maven-plugin 的依赖:

 

<build>   [...]       <plugin>         <groupId>org.codehaus.mojo</groupId>         <artifactId>sql-maven-plugin</artifactId>

紧接着,由于该插件需要使用JDBC来执行SQL脚本,因此还需要配置对JDBC驱动的依赖,如:

 

        <dependencies>           <!-- specify the dependent jdbc driver here -->           <dependency>             <groupId>postgresql</groupId>             <artifactId>postgresql</artifactId>             <version>8.1-407.jdbc3</version>           </dependency>         </dependencies>

在此基础上便是数据库的基本配置了,通常包括URL,Username和Password。这是一个通用的配置,默认情况下,在此之后的目标(goal)都会使用这个配置,除非将其覆写。

 

        <!-- common configuration shared by all executions -->         <configuration>            <username>postgres</username>            <password>password</password>            <url>jdbc:postgressql://localhost:5432:yourdb</url>         </configuration>
 

典型的脚本包括以下步骤:

  1. 删除旧数据库
  2. 创建新数据库
  3. 创建表,索引等
  4. 插入初始数据
  5. 删除数据库

当然我们可以根据具体情况裁剪这些步骤,比如,如果我们需要在一段时间内使用这个脚本创建的干净数据库环境,我们可以不执行最后一步:删除数据库。需要注意的是,执行很多DDL的时候我们一般需要最高的数据库权限。

首先来看一下删除旧数据库,注意这里的URL不是我们上面配置的基本配置,因为我们需要删除'yourdb',因此我们只能使用系统的初始数据库。如果'yourdb'数据库不存在,执行出错,则跳过继续下一步:

 

        <executions>             <execution>             <id>drop-db-before-test-if-any</id>             <phase>process-test-resources</phase>             <goals>               <goal>execute</goal>             </goals>             <configuration>               <!-- need another database to drop the targeted one -->               <url>jdbc:postgressql://localhost:5432:bootstrapdb</url>               <autocommit>true</autocommit>               <sqlCommand>drop database yourdb</sqlCommand>               <!-- ignore error when database is not avaiable -->               <onError>continue</onError>             </configuration>           </execution>

现在需要创建我们的数据库yourdb,和上面一样,URL指向系统初始数据库,这里的sql comand为建库命令:

 

          <execution>             <id>create-db</id>             <phase>process-test-resources</phase>             <goals>               <goal>execute</goal>             </goals>             <configuration>               <url>jdbc:postgressql://localhost:5432:yourdb</url>               <!-- no transaction -->               <autocommit>true</autocommit>               <sqlCommand>create database yourdb</sqlCommand>             </configuration>           </execution> 

 然后执行的建表命令,这里配置了srcFiles,我们可以将schema的脚本写在sql文件里,然后配置在这里,顺序执行:

 

          <execution>             <id>create-schema</id>             <phase>process-test-resources</phase>             <goals>               <goal>execute</goal>             </goals>             <configuration>               <autocommit>true</autocommit>               <srcFiles>                 <srcFile>src/main/resourced/your-schema.sql</srcFile>               </srcFiles>             </configuration>           </execution>

DB和Schema没问题之后,我们通常需要插入一些系统的初始数据,或者测试的初始数据:

 

          <execution>             <id>create-data</id>             <phase>process-test-resources</phase>             <goals>               <goal>execute</goal>             </goals>             <configuration>               <orderFile>ascending</orderFile>               <fileset>                 <basedir>${basedir}</basedir>                 <includes>                   <include>test/sql/test-data2.sql</include>                   <include>test/sql/test-data1.sql</include>                 </includes>               </fileset>             </configuration>           </execution>

最后,测试完了之后,删除数据库:

 

          <!-- drop db after test -->           <execution>             <id>drop-db-after-test</id>             <phase>test/phase>             <goals>               <goal>execute</goal>             </goals>             <configuration>               <autocommit>true</autocommit>               <sqlCommand>drop database yourdb</sqlCommand>             </configuration>           </execution>         </executions>       </plugin>     [...] 

最后让我们回头再来看看这个五个步骤,其实它们都用了 sql-maven-plugin 的 execute 目标,除了drop-db-after-test,它们都配置了 process-test-resources 生命周期。这样配置的目的是让删旧库,建库,建表,插数据这些步骤在测试之前完成,这样,测试的时候就有一个完好的数据库了,测试完了之后,再把建好的数据库删除。

通过建一个Maven项目,使用 maven-sql-plugin 管理数据库脚本的执行,然后使用CI服务器来调用这个Maven项目,我们就可以实现基于Maven的CDBI了。


本文的讨论也很精彩,浏览讨论>>


JavaEye推荐





From The Blogs

Internet Observation

05-04
《家居——可持续建筑与设计》书评
文/米斯卡·瑟里阿特        无论是在湖边,或是其他地方,或两者兼而有之,我丈夫和我都知道总有一天我们要从头开始建造一个家。我们也清楚我们建房子时所要负起的生态环境责任。每次我们考虑这问题,总会... 查看全文

Business, Finance, Management

06-05
食品价格持续较高
(在南埃塞俄比亚紧急食品援助中心,埃塞俄比亚籍三岁儿童Bizunesh Hidana,体重不到4公斤。联合国食品计划署预计,由于近来雨水侵袭,埃塞俄比亚将有270万人需要紧急食品援助。)      据... 查看全文

Personal Growth, Career Planning

2007
如何保持持续的行动力
每当提到目标、方案,以及其它要做的项目,人们往往容易在考虑和计划的阶段中停滞太久。你可以稳坐泰山,对你的目标涂涂抹抹,深入钻研你的潜意识,努力突破情绪上的障碍,召唤雷神的力量……做些诸如之类的玩意儿。... 查看全文

World,Fashion, Entertainment

03-11
发展中国家食品部门演变中的道德问题:可持续发展和公平(节选)
引言   当今对于未来食品供应的挑战主要来源于对于食品需要的满足。这些挑战在先前的一些文章中已经分析过了。(Raoult-Wack and Bricas,1998;Raoult-Wack and Br... 查看全文

分享网络2.0

02-19
Blist——基于Web的数据库管理程序
Blist 是一款基于Flash/Flex平台,以Web-Base方式架构在服务器上的SQL数据库管理程序。Blist 同样是一家在今年DEMO大会上崭露头角的创新型企业,他们为用户带来了一款基于Fl... 查看全文

科学网新闻RSS——构建全球华人科学社区

07-24
联合国建成新的全球土壤数据库
联合国粮食及农业组织7月21日宣布,一个新的全球土壤数据库已经建立,该数据库将有助于人类更好地了解土壤现有和未来的生产能力,提高人类对土地所具有的吸收和存贮碳的潜力的认识,同时也便于开展土壤退化评估,... 查看全文

想飞的鱼

09-16
越狱第四季在线看……持续更新中
剧情介绍: 这季的主要内容将是兄弟俩与公司的复仇对抗。 新演员迈克尔·拉帕波特(Michael Rapaport)加盟成为第四季的常规演员,饰演帮助迈克尔、越狱第四季第四集免费下载 越狱第4季第4集在... 查看全文

鬼仔's Blog

07-24
python写的oracle数据库密码扫描工具
备用地址 作者:空虚浪子心 闲来无事,写个小工具。扫oracle密码。 水平有限,对python没有深究,甚至在写工具的时候连or这种条件语句都不会。 所以大家将就下。。。 oraclespasswo... 查看全文

葡萄树

07-24
规范化----数据库设计之表设计
在基于表驱动的信息管理系统(MIS)中,基本表的设计规范是第三范式(3NF)。第三范式的基本特征是非主键属性只依赖于主键属性。基于第三范式的数据库表设计具有很多优点:一是消除了冗余数据,节省了磁盘存储... 查看全文

ChinaVenture投资中国网·中国最大创业投资行业门户

09-18
巨人史玉柱称下半年持续收购 游戏中拟内置广告
巨人网络董事长史玉柱在接受腾讯科技专访时再度表示,巨人将在下半年继续展开收购,不过暂时没有可公布的收购计划。  近日,曾有消息称巨人网络将以5亿美元收购久游,巨人网络董事长兼CEO史玉柱正面进行了 查看全文
More Articles
Elanso is a professional online platform which provides translation service for corporate or individule clients, opportunities for translation practice and translation jobs, and translation tool/software-download. Our online translators provide about 186 languages' translation service, including Japanese,Korean, French, German, Spanish, etc, among which, 20,000 are English translators. And some big translation service companies in Shanghai, Beijing, Nanjing also registered here.