数据库持续集成ecdiy-db与liqbase使用介绍
ecdiy-db
项目文档
ecdiy-db
代码地圵
https://github.com/ecdiy/ecdiy-db
任何项目开发,都会有本地开发环境,生产环境.本地开发时数据表,存储过程,会产生变化,如果每次本地的变化都要手动去改生产库,而不是自动完成,那只能说明你的水平太low.解决这个问题的工具叫数据库的持续集成,分两步来实现,一.生成数据库差异(diff)二.生产库执行更新.
类似的项目:java liqbase ruby on rails的database migration
生成差异
main conf=./conf/diff.xml 另外一种执行方式,copy main.exe为diff.exe ,运行程序则程序自动找./conf/diff.xml配置文件
快速执行更新
main conf=./conf/fast-update.xml 另外一种执行方式,copy main.exe为fast-update.exe ,运行程序则程序自动找./conf/fast-update.xml配置文件
更新,并校验历史SQL
main conf=./conf/update.xml 另外一种执行方式,copy main.exe为update.exe ,运行程序则程序自动找./conf/update.xml配置文件
下面介绍liqbase的使用
一段windows下使用DIFF的批处理
cls cd /d %~dp0 set log=%~dp0all.log cd ../youpin-poms call mvn clean install > %log% if ""%errorlevel%""==""1"" goto eof echo poms install ok. install util %errorlevel%.... cd ../youpin-utils call mvn clean install >> %log% if ""%errorlevel%""==""1"" goto eof echo poms install ok. sql:execute %errorlevel%.... cd ../youpin-commons call mvn clean sql:execute -DsqlSrcFile=db/script/check.db.exist.sql -Dspring.generateDdl=true -Dhibernate.hbm2ddl.auto=update -Ddb.generateDdl=true -Ddb.url="jdbc:mysql://127.0.0.1:3306/mysql?characterEncoding=utf-8&autoReconnect=true" -Plocal-dev >> %log% if ""%errorlevel%""==""1"" goto eof echo clean sql:execute. liquibase:update %errorlevel%.... call mvn clean liquibase:update -Dfile.encoding=UTF-8 -Plocal-product >> %log% if ""%errorlevel%""==""1"" goto eof echo sql:update. test %errorlevel%.... call mvn clean -Dtest=test.SpringTestBase#init test -Plocal-dev -Dmaven.test.skip=false >> %log% if ""%errorlevel%""==""1"" goto eof echo test ok.dif %errorlevel%... call dbliquibaseliquibase --liquibaseSchemaName=youpin --changeLogFile="db/script/changelog.xml" --driver=com.mysql.jdbc.Driver --url="jdbc:mysql://127.0.0.1:3306/youpin?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true" --username=root --password=root2011 diffChangeLog --referenceUrl="jdbc:mysql://127.0.0.1:3306/youpindev?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true" --referenceUsername=root --referencePassword=root2011 -Dfile.encoding=UTF-8 pause :eof
这段脚本功能说明, 1.先清空本地库所有表, 2.用liqbase update从历史先成数据库, 3.用junit test 从java bean 用 hibernate 生成数据库 4.diff生成差异.注意不支持存储过程.
部分pom.xml
<properties>
<changeLogFile>db/script/changelog.xml</changeLogFile>
</properties>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<changeLogFile>${changeLogFile}</changeLogFile>
<promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
<driver>${db.driver}</driver>
<url>${db.url}</url>
<username>${db.username}</username>
<password>${db.password}</password>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>sql-maven-plugin</artifactId>
<version>1.4</version>
<configuration>
<driver>${db.driver}</driver>
<username>${db.username}</username>
<password>${db.password}</password>
<url>${db.url}</url>
<autocommit>true</autocommit>
<srcFiles>
<srcFile>${sqlSrcFile}</srcFile>
</srcFiles>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
部分changeLog.xml
.......
<changeSet author="dev-cz (generated)" >
<createTable tableName="PackagePlanLog">
<column autoIncrement="true" name="id" type="BIGINT(19)">
<constraints primaryKey="true"/>
</column>
<column name="creatAt" type="datetime"/>
<column name="description" type="VARCHAR(255)"/>
<column name="planId" type="BIGINT(19)">
<constraints nullable="false"/>
</column>
<column name="remark" type="VARCHAR(255)"/>
<column name="sysUserId" type="BIGINT(19)">
<constraints nullable="false"/>
</column>
</createTable>
</changeSet>
....
比较
这两个项目,我都使用过,ecdiy-db我现在开发在使用,特点就是快,目前只支持mysql,支持存储过程,函数,可以自定义脚本,修改核心代码简单,diff与fast-update都是一个脚本搞定,changelog可以删除无效的历史,但必须保留最后一个. liqbase 且不支持存储过程,changelog不能修改,不能删除,修改很费劲.