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:“空结果集,预期为一行”

Liquibase:Migrate.sql 不检查前提条件

Linux下安装gradle

MongoDB 中 runCommand 的 Liquibase 语法

Liquibase:MySQL 存储过程中的 SQL 语法错误