Liquibase在Java世界中类似于EntityFramework(EF)。并且liquibase: diff
=Add-迁移
在EF
中。但问题是liquibase: diff
只生成变更日志
,但没有回滚。有可能在回滚的同时生成差异吗?
我试着用liquibase:rollback创建回滚脚本。但它并不能在所有情况下都生成回滚脚本,例如,当我删除了一个带有更改集的列,然后想要回滚时。设置或运行时出错
Liquibase: liquibase.exception.RollbackImpossibleException: No inverse to liquibase.change.core.DropColumnChange created -> [Help 1]
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=;”
鉴于对源系统和目标系统的了解,虽然diff可能会创建“更多”回滚(例如,在编写“DROP column”变更集并注入自定义“rollback”部分时从“旧版本”中提取列数据类型),但它最终会产生虚假安全感,使其达到不需要的程度。
因此不需要总是从生成的变更日志中删除该属性是很好的。
case-0-3.sql: 我在进行任何更改之前标记数据库: 之后,我在每个文件应用后应用文件和标记数据库: 求求你,救命。可能有人在sql或其他格式中使用回滚操作?哪里错了?我做错了什么?它是工作液基功能吗?
我是否遗漏了任何设置?
我想把liquibase介绍到我的项目中,首先,我想根据我的hibernate实体生成一个changelog文件。 感谢你的帮助.
case-0-3.sql: I在进行任何更改之前标记数据库: 之后,我应用文件,并在每个文件应用后标记数据库:
我是liquibase的新手,我想在生产中的数据库上使用它。这是一个很小的应用程序,但我不想手工创建模式,而是想使用更专业的东西,比如LiquiBase。 我计划做的是在生产中的当前模式和新模式之间为新应用程序准备一个changelog。我已经遵循了许多教程,但仍然缺少一些东西。输出changelog.xml总是导入所有模式,并且与现有模式没有区别。我看到liquibase必须创建表DATABAS