Liquibase 前置条件的 Groovy 语法是啥?
Posted
技术标签:
【中文标题】Liquibase 前置条件的 Groovy 语法是啥?【英文标题】:What is the Groovy syntax for Liquibase preconditions?Liquibase 前置条件的 Groovy 语法是什么? 【发布时间】:2018-03-30 07:58:59 【问题描述】:总结
如果表格不存在,我必须在表格上添加一列。
列名: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 版本,我不确定,也没有已知的测试方法。
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')
而且我不确定 Groovy 语法如何将较高的 XML 版本转换为 Groovy。
告诉我,XML 变更集将如何转换为 Groovy?
【问题讨论】:
如果你已经在使用Liquibase,你真的不需要前置条件。 【参考方案1】:您的变更集看起来不错 IMO,但我不知道“默认”属性,column 和约束标记都不知道。 tableName 和 columnName 后面的等号也应该是冒号。 但是,如果 XML 版本运行,我会说 groovy 版本也会运行。
您可以省略not
行中的圆括号。
您可能还想将 onFail
值更改为 MARK_RAN
,这样 liquibase 下次就不会尝试运行它了。
我会按以下顺序测试更改:
在没有列的情况下使用您的测试数据库 让变更集运行 查看DATABASECHANGELOG
表并搜索变更集。您应该在EXECTYPE
列中看到EXECUTED
,在DESCRIPTION
列中看到一些不错的内容。检查数据库是否已按预期修改。
删除DATABASECHANGELOG
表中变更集的列并启动您的应用程序/重新运行变更日志。变更集将再次运行。
再次查看DATABASECHANGELOG
表。现在您应该再次看到该行,但 EXECTYPE
应该是 MARK_RAN
。
【讨论】:
【参考方案2】:您对变更集的常规转换存在一些小问题:
Groovy(和 Liquibase DSL)区分大小写 标记属性应作为 Groovy Map 使用“:”而不是“=”传递,并且它们之间需要逗号 “default”(或“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')
这样就不会反复执行。
【讨论】:
以上是关于Liquibase 前置条件的 Groovy 语法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
Liquibase 对 sql 中所有更改日志文件的先决条件
Grails 中的 Liquibase:“空结果集,预期为一行”