我正在设置一个发布流程,以尽可能轻松地升级我们的生产环境。
为了实现数据库方面的目标,我选择了 liquibase。每次环境升级时:
代码交付到服务器上,
mvn liquibase:diff
运行以生成先前版本的变更日志
mvn spring-boot:run
运行以启动应用程序并使用新的变更日志执行 liquibase,因此,从新交付的代码实体调整数据库。
问题是,例如,如果将java 中的字段移动到其他实体,liquibase将删除该列,而不将数据传输到新的字段位置。@Entity
所以我的问题是,我们可以配置 liquibase 来避免列和表删除吗?为了能够将数据复制到新位置,然后有效地永久删除列(或表)?
我们使用spring-boot 2.1.2和liquibase maven 插件 3.4.1。我们的数据库是MySQL 5.7.27。
我试图找到如何导出一个中的所有数据库创建/更改 以及另一个中的所有数据库创建/更改。就像我们可以在这两个之间执行,第三个专门用于将数据复制到新位置。Bu 在 liquibase 文档中没有找到解决方案:https://www.liquibase.org/documentation/diff.htmlchangeSet
changeLog.xml
changeSet
changeLog.xml
changeLog
changeLog
v1:
@Entity
public class Person {
private long id;
private String name;
private String phoneNumber;
}
成为
v2 : (创建实体Phone来替换实体Person的字段phoneNumber )
@Entity
public class Person {
private long id;
private String name;
private Phone phone;
}
@Entity
public class Phone {
private long id;
private String phoneNumber;
private String brand;
}
因此,当v2交付到服务器上并mvn liquibase:diff运行时,结果 ChangeLog 将删除phoneNumber列并在表person中创建列phone。在不从表person传输数据的情况下,将phoneNumber归档到新表phone字段phoneNumber中。
我想执行将Person.phoneNumber复制到新实体Phone.phoneNumber的 changeLog (手动编写) 。
那可能吗 ?或者有什么技巧可以正确地做到这一点?或者也许我以不好的方式使用 liquibase 来实现这一目标?
森林海
相关分类