Liquibase标签命令标签太多了

时间:2015-03-26 15:36:07

标签: mysql database liquibase

我使用Liquibase进行开发。我的数据库是MySQL 5.5.42。这是我的示例更改日志文件:

databaseChangeLog:
  - changeSet:
      id: 1.0.0
      author: madhead
      changes:
        - sqlFile:
            path: "changesets/001-create_tables.sql"
            relativeToChangelogFile: true
      rollback:
        - sqlFile:
            path: "changesets/-001-drop_tables.sql"
            relativeToChangelogFile: true
  - changeSet:
      id: 1.0.0-tag
      author: madhead
      changes:
        - tagDatabase:
            tag: 1.0.0
  - changeSet:
      id: 1.1.0
      author: madhead
      changes:
        - sqlFile:
            path: "changesets/002-create_triggers.sql"
            relativeToChangelogFile: true
            endDelimiter: ";;"
      rollback:
        - sqlFile:
            path: "changesets/-002-drop_triggers.sql"
            relativeToChangelogFile: true
  - changeSet:
      id: 1.1.0-tag
      author: madhead
      changes:
        - tagDatabase:
            tag: 1.1.0

如您所见,在每个变更集之后我都标记了一个数据库(它还可以吗?)我希望从头开始运行1.0.0-tag后,1.1.0-tagliquibase update变更集会得到相应的标记。但我得到的是所有变更集都标记有最新标记:

OMG, everything is tagged with latest tag!

如果我随后四次使用updateCount 1,一切都还可以:

What I want to see

我认为问题可能是DATEEXECUTED,这对于所有变更集都是相同的。这是正确的行为吗?我怎样才能克服它?

1 个答案:

答案 0 :(得分:1)

您的诊断是正确的,因为第一个示例中的所有四个更改日志行都具有完全相同的日期和时间。查看the documentation for the tagDatabase change,它表明生成的SQL是

UPDATE DATABASECHANGELOG SET TAG = 'version_1.3' WHERE DATEEXECUTED = (SELECT MAX(DATEEXECUTED) FROM (SELECT DATEEXECUTED FROM DATABASECHANGELOG) AS X);

我认为唯一的解决方法是使用某种方法来确保不同标签的更新在稍微不同的时间运行。使用您提到的updateCount 1是一种方法,但您也可以使用标签或上下文。