摘要
如果表上不存在列,我必须添加它。
列名:myColumn
表名:myTable
使用Groovy语言和Liquibase,我想检查列是否存在,如果不存在就创建它。
Liquibase
XML
根据我的搜索,实现这一点的XML方式是:
<changeSet id="myChangeSet" author="me">
<preconditions onFail="WARN">
<not>
<columnExists tableName="myTable" columnName="myColumn" />
</not>
</preconditions>
<addColumn tableName="myTable">
<column name="myColumn" type="text" default="null" />
</addColumn>
</changeSet>
Groovy
至于Groovy版本,我不确定,也没有已知的测试方法
changeSet(id:'myChangeSet', author:'me') {
preconditions(onFail:'WARN') {
not() {
columnExists(tableName='myTable' columnName='myColumn')
}
}
addColumn(tableName:'myTable') {
column(name:'myColumn' type:'text') {
constraint(default:'null')
}
}
}
我不确定Grrovy语法如何将上层XML版本转换为Groovy。
告诉我,XML变更集将如何转换为Groovy?
您对变更集的groovy转换存在一些小问题:
- Groovy(和Liquibase DSL)区分大小写
- 标记属性应使用":"而不是"="作为Groovy Map传递,并且它们之间需要逗号
- "默认";(或类似"defaultValueComputed"的变体之一)是列的属性,而不是子项
请参阅以下更正版本:
changeSet(id:'myChangeSet', author:'me') {
preConditions(onFail:'WARN') {
not {
columnExists(tableName: 'myTable', columnName: 'myColumn')
}
}
addColumn(tableName: 'myTable') {
column(name: 'myColumn', type: 'text', defaultValue: null)
}
}
此外,我认为将先决条件倒置为";如果该列已经存在,则我们无事可做":
preConditions(onFail:'MARK_RAN') {
columnExists(tableName='myTable' columnName='myColumn')
}
这样就不会一次又一次地执行。
您的变更集看起来不错IMO,但我不知道列和约束标记的"default"属性。tableName和columnName后面的等号也应该是冒号。但是,如果XML版本运行,那么groovy版本也将运行。
可以省略not
行中的圆括号。您可能还想将onFail
值更改为MARK_RAN
,以便liquibase下次不会尝试运行它。
我将按以下顺序测试更改:
- 使用不带列的测试数据库
- 让变更集运行
- 查看
DATABASECHANGELOG
表并搜索变更集。您应该在EXECTYPE
列中看到EXECUTED
,在DESCRIPTION
列中看到一些不错的内容。检查数据库是否已按预期进行了修改 - 删除
DATABASECHANGELOG
表中变更集的列,然后启动应用程序/重新运行变更日志。变更集将再次运行 - 再次查看CCD_ 9表。现在您应该再次看到该行,但是
EXECTYPE
应该是MARK_RAN