我已经用Spring试用过LiquiBase3.0测试版了(顺便说一句,它不适合2.0)。很顺利。
现在,我正在用Ant和相同的数据库和changelog测试它,在回滚所有更改并删除表DATABASECHANGELOG和DatabaseChangeloglock之后。
问题是liquibase将所有更改集记录在表DATABASECHANGELOG中,这意味着我的配置中没有任何错误,但它没有将更改提交给数据库。
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.0.xsd">
<preConditions>
<dbms type="mysql"/>
</preConditions>
<changeSet id="1" author="bob" runAlways="true">
<createTable tableName="department">
<column name="id" type="int">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="name" type="varchar(50)">
<constraints nullable="false"/>
</column>
<column name="active" type="boolean" defaultValueBoolean="true"/>
</createTable>
</changeSet>
<changeSet id="2" author="roger" runAlways="true">
<comment>test add column</comment>
<addColumn tableName="department">
<column name="header" type="varchar(8)"/>
</addColumn>
</changeSet>
<changeSet id="3" author="gabriel" runAlways="true">
<createTable tableName="records">
<column name="id" type="int" autoIncrement="true">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="title" type="varchar(50)"/>
</createTable>
</changeSet>
<changeSet id="4" author="gabriel" context="test" runAlways="true">
<insert tableName="records">
<column name="title" value="Liquibase 0.8 Released"/>
</insert>
<insert tableName="records">
<column name="title" value="Liquibase 0.9 Released"/>
</insert>
</changeSet>
<changeSet id="6" author="nvoxland" runAlways="true">
<comment>test update eam_company</comment>
<sql>update eam_company set companyName='haha' where companyId=15</sql>
</changeSet>
</databaseChangeLog>
<?xml version="1.0" encoding="utf-8"?>
<project name="ncpsys_v2" default="all">
<!-- define time stamp -->
<tstamp>
<format property="current.time" pattern="yyyy_MM_dd_HH_mm_ss"/>
</tstamp>
<!-- define varibles and path -->
<property file="liquibaseconf.properties"/>
<path id="ant.classpath">
<fileset dir="${ant.home}">
<include name="**/*.jar"/>
</fileset>
</path>
<target name="sync-database">
<fail unless="db.changelog.file">db.changelog.file not set</fail>
<fail unless="database.url">database.url not set</fail>
<fail unless="database.username">database.username not set</fail>
<fail unless="database.password">database.password not set</fail>
<taskdef resource="liquibasetasks.properties">
<classpath refid="ant.classpath"/>
</taskdef>
<changeLogSync changeLogFile="${db.changelog.file}" driver="${database.driver}" url="${database.url}" username="${database.username}" password="${database.password}" promptOnNonLocalDatabase="true" defaultSchemaName="root" classpathref="ant.classpath">
</changeLogSync>
</target>
<target name="all" depends="sync-database"/>
</project>
LiquiBaseTasks.Properties文件
local.dir=.
#gwt.home=E:/work/libaray/gwt-2.3.0
jdk.home.1.6=C:/Program Files/Java/jdk1.6.0_10
ant_home=D:/software/apache-ant-1.8.3
tomcat.home=C:/Program Files/Apache Software Foundation/apache-tomcat-6.0.36
#liquibase config
database.driver=com.mysql.jdbc.Driver
database.url=jdbc:mysql://localhost:3306/ncpsys_v2?useUnicode=true&characterEncoding=UTF-8
database.username=root
database.password=1234
db.changelog.file=changelog.xml
我运行Ant任务,liquibase为我创建了表DATABASECHANGELOG和DATABASECHANGELOGLOCK,并在DATABASECHANGELOG中插入日志。
我的生成日志:
sync-database:
[changeLogSync] INFO 13-4-2 下午1:22:liquibase: Successfully acquired change log lock
[changeLogSync] INFO 13-4-2 下午1:22:liquibase: Creating database history table with name: `ncpsys_v2`.`DATABASECHANGELOG`
[changeLogSync] INFO 13-4-2 下午1:22:liquibase: Reading from `ncpsys_v2`.`DATABASECHANGELOG`
[changeLogSync] INFO 13-4-2 下午1:22:liquibase: Reading from `ncpsys_v2`.`DATABASECHANGELOG`
[changeLogSync] INFO 13-4-2 下午1:22:liquibase: Successfully released change log lock
all:
BUILD SUCCESSFUL
Total time: 2 seconds
您正在运行changeLogSync ANT任务。描述如下:
将所有更改集标记为对数据库运行。在手动更新数据库时很有用。
这解释了为什么没有向数据库提交任何内容。我认为您应该改用updateDatabase任务
这方面有什么最佳做法吗?我们不能在LiquiBase中手动设置事务吗?
我有 在我的构建中。gradle我有 但是尽管成功了-到我的数据库中,它并没有添加任何新表。我有postreSQL,其中包含我所有表所在的方案- 我的控制台输出
当本地文件变更以后,可以通过VCS —> Git —> Commit File 弹出提交变更窗口. 当然,分支合并过后也会弹出提交变更窗口. 配置提交信息 提交变更窗口中你可以选择Change list,也可以选择要提交的变更文件,默认是全选的. 在Author中选择或者输入作者名字.选择Amend commit(修订提交)会在Commit Message中添加上一次的提交信息. 在提交之前,你还
我们使用liquibase对数据库进行源代码控制。最初,我们从Postgres开始,创建了数据类型为特定于Postgres的列的变更集。 例如,我们有一个变更集,它创建了具有“JSON”类型字段的表。现在,我们想转移到其他数据库。因此,当我们针对另一个数据库运行变更集时,它无法创建表。我尝试添加“failOnError=false”。但是,后面的变更集失败,因为该表不存在。 您能建议如何重构旧的变
我有许多变更集,如果存在特定条件,我想要运行这些变更集。例如,仅当sqlCheck以例外结果执行时,才运行变更集1、2和3。 我可以将前置条件复制到每个变更集中。然而,它感觉应该有一个更有效的方法来做这件事。随着变更集数量的增长,文件中有很多重复项。 感谢任何帮助。
我想在changelog文件中使用以下变更集标记数据库,以便将来回滚。当我应用这个变更集时,我在databasechangelog中注意到,前面的变更集也用标记更新了。 changelog文件中的变更集 下面是从databasechangelog表中提取的内容,function51是上一次运行的变更集 有人遇到过吗?我使用的是Liquibase 3.1.1 多谢了。