我是新来的liquibase,我正在玩diff命令。它工作得很好,但最近发现了这个,我不明白为什么它在这个特定的上下文中不起作用。
所以主要的问题是我想比较两个数据库,但没有索引。它们是在主键上动态生成的,具有不同的名称,但实际上是等效的。Liquibase不理解,所以我想运行diff不带索引。
所以我把这个添加到pom。xml中:
<diffTypes>tables, views, columns, primaryKeys, foreignKeys, uniqueconstraints</diffTypes>
按预期运行,liquibase不比较索引
在下一步中,我想要生成diff作为变更日志,所以我添加了一个diffChangeLog-File
<diffTypes>tables, views, columns, primaryKeys, foreignKeys, uniqueconstraints</diffTypes>
<diffChangeLogFile>src/main/diffs/diff_test.xml</diffChangeLogFile>
运行liquibase:diff失败:
[ERROR] Failed to execute goal org.liquibase:liquibase-maven-plugin:3.4.1:diff (default-cli) on project liquibase_artifactID: Error setting up or running Liquibase: liquibase.command.CommandExecutionException: liquibase.exception.UnexpectedLiquibaseException: Could not resolve MissingObjectChangeGenerator dependencies due to dependency cycle. Dependencies:
[ERROR] [] -> Catalog -> []
[ERROR] [] -> Schema -> []
[ERROR] [Index] -> ForeignKey -> []
[ERROR] [] -> UniqueConstraint -> []
[ERROR] [] -> Column -> []
[ERROR] [] -> Table -> []
[ERROR] [] -> PrimaryKey -> []
[ERROR] [] -> View -> []
[ERROR] -> [Help 1]
为什么liquid base是这样的?生成没有索引的diffChangeLog是"非法的"吗?
当包含索引到diffTypes时,它可以工作,但是生成的Changelog是不可用的,因为liquidbase想要用createIndex和dropIndex更改索引。但是这些语句是不可执行的(它不能在主键上删除索引,并且当索引已经存在时它不能创建索引)。
你知道如何在没有索引的情况下生成可用的变更日志吗?还是我错过了什么?
问题的答案就在异常消息中:
Could not resolve MissingObjectChangeGenerator dependencies due to dependency cycle.
然后列出依赖项。
在内部,Liquibase正在生成依赖关系的有向图,并确保所有依赖关系都得到满足。如果您想查看实现此功能的代码,请参阅类DiffToChangeLog及其内部私有类DependencyGraph