Liquibase前提条件的Groovy语法是什么



摘要

如果表上不存在列,我必须添加它。

列名: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

相关内容

  • 没有找到相关文章

最新更新