数据库持续集成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不能修改,不能删除,修改很费劲.