Liquibase 与Java世界中的 EntityFramework(EF)类似。
并且liquibase:diff
中的Add-Migration
= EF
。
但是问题在于liquibase:diff
仅生成changelog
,而没有回滚。
是否可以与回滚一起生成差异。
我尝试使用liquibase:rollback
创建回退脚本。但是它不能在所有情况下都生成回滚脚本,例如当我删除具有更改集的列并后来想要回滚时。
设置或运行
Liquibase: liquibase.exception.RollbackImpossibleException: No inverse to liquibase.change.core.DropColumnChange created -> [Help 1]
答案 0 :(得分:0)
Liquibase的作者内森·沃克斯兰(Nathan Voxland)在这里几乎回答了您的问题:http://www.liquibase.org/2007/06/the-problem-with-database-diffs.html
简而言之,diff
所产生的某些更改本身就值得怀疑,直到有资格了解该更改目的的合格开发人员进行审核为止。
回滚更加复杂,因此在大多数情况下,回滚留给开发人员。
正如Jens在对您的问题的评论中提到的那样,您生成的某些更改可能会自动回滚(相对安全)。但是,其他人则不能很好地工作。
如果存在没有自动回滚方式的变更集,则需要在变更集中编写自己的回滚。例如,如果您删除一列-变更集本身中没有足够的信息来重新创建该列和所有数据。反转脚本可能类似于“ ALTER TABLE Z; UPDATE TABLE Z SET A =;”
考虑到源系统和目标系统的知识,luquibase:diff
可能会创建“更多”回滚(例如,从“旧版本”中获取列数据类型,同时编写“ DROP COLUMN”变更集并注入自定义“回滚”部分),最终会产生一种虚假的安全感,使其达到不希望的程度。