- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在设置发布流程以尽可能轻松地升级我们的生产环境。
为了实现与数据库相关的目标,我选择了 liquibase。每次升级环境时:
mvn liquibase:diff
运行以生成以前版本的变更日志mvn spring-boot:run
运行以启动应用程序并使用新的 changeLog 执行 liquibase,因此,根据新交付的代码实体调整数据库。问题是,例如,如果 java @Entity
中的一个字段被移动到另一个实体, liquibase 将删除该列而不会将数据传输到新的字段位置。
所以我的问题是,我们可以配置 liquibase avoid column and table drop 吗?为了能够将数据复制到新位置,然后永久有效地删除列(或表)?
我们正在使用 spring-boot 2.1.2 和 liquibase maven 插件 3.4.1。我们的数据库在 MySQL 5.7.27 上。
我试图找到如何在一个 changeLog.xml
和所有 drop 中导出所有数据库 creation/alteration changeSet
changeSet
在另一个 changeLog.xml
中。这样我们就可以在这两个 changeLog
之间执行,第三个 changeLog
专门用于将数据复制到它们的新位置。Bu 没有在 liquibase 文档中找到解决方案:https://www.liquibase.org/documentation/diff.html
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 来实现这一目标?
非常感谢!
最佳答案
也许我遗漏了什么,但据我所知,diff
并不是可以免除您任何责任的万能工具。
在某些情况下,您必须自己编写 changeSet,我认为这就是其中之一。
由于 diff
确实是一个非常强大的命令,它也有它的缺点。
查看这篇文章:The Problem With Database Diffs
Theoretically, a diff tool could also check for new, updated, and missing data between database, but in practice this cannot work for two reasons:
- Performance. As your data set grows, the amount of information to compare grows until it is unmanageable.
- Changing Data. During development, test data is often added to the development database that shouldn’t be copied into other databases. Also, new data may be added to testing and production databases that should not be deleted just because it doesn’t exist in the development database.
在你的情况下,我会做这样的事情:
phone
person.phone_id
person.phone_number
复制到 phone.phone_number
phone.id
复制到 person.phone_id
person
和phone
之间创建外键约束person.phone_number
代码可能是这样的:
<createTable tableName="phone">
<column name="id" autoIncrement="true" type="bigserial">
<constraints primaryKey="true" primaryKeyName="pk_phone"/>
</column>
<column name="phone_number" type="varchar(30)"/>
<column name="brand" type="varchar(255)"/>
</createTable>
<addColumn tableName="person">
<column name="phone_id" type="bigserial"/>
</addColumn>
<update tableName="phone">
<column name="phone_number" valueComputed="(select p.phone_nubmer from person p)"/>
</update>
<comment>Assuming that person.phone_number is unique</comment>
<update tableName="person">
<column name="phone_id" valueComputed="(select p.id from person p where p.phone_number = phone_number)"/>
</update>
<addForeignKeyConstraint baseTableName="person" baseColumnNames="phone_id"
constraintName="person_phone_id_phone_id_fk"
referencedTableName="phone" referencedColumnNames="id"/>
<dropColumn tableName="person" columnName="phone_number"/>
关于java - 使用 mvn liquibase :diff? 时如何禁用删除表和列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58625731/
我目前正在将 liquibase 与基于 SQL 的变更集一起使用,其中大多数都包含 INSERT 语句。根据文档,这种类型的更新操作不会产生(通过工具)自动回滚语句。 我的问题是(我可能遗漏了一些东
我刚刚开始使用 liquibase,它似乎很有用。我最大的问题是回滚。 我正在将我的 liquibase 变更日志烘焙到其中包含我的数据层的 jar 中,并且在应用程序启动时,我正在使用应用程序中的
我正在针对一个干净的 HSQLDB 实例同时运行 Liquibase 迁移,当其中一个更新成功时,另一个失败,如下所示: Exception in thread "Thread-7" liquibas
我正在尝试在雪花上开始使用 liquibase。 我想我已经快完成 liquibase.properties 文件了 driver: net.snowflake.client.jdbc.Snowfla
正在使用的 liquibase 版本 - org.liquibase:liquibase-core:3.8.2。 (不是专业版) Liquibase 文档(1 和 2)在下面说明了 splitStat
我正在使用 Liquibase 对现有数据库进行版本控制,所以我正在使用 liquibase \ --logLevel=debug \ --driver=com.mysql.jdbc.Driv
我在使用 liquibase 更改 postgres 数据库中的列长度时遇到问题。 我有一个带有字段描述 varchar(300) 的表帐户。我想把它改成 varchar(2000)。 我在同一个文件
问题:当用户被删除时,关联的记录不会从数据库中删除。相反,我设置了 user.delete列到 true .现在我需要在 user.email 上设置一个唯一约束但仅适用于事件用户(未删除)。 我怎样
我想更好地了解 Liquibase 如何执行变更集。 1) a) 例如,我有一个包含 4 个更改集的更改日志,我执行 updateDatabase ( http://www.liquibase.org
运行 liquibase --url=jdbc:oracle:thin:@localhost:1521/XE -- driver=oracle.jdbc.OracleDriver --chang
我已经看到如何重命名 DATABASECHANGELOG 表,但我想要做的是在每个服务器的一个数据库中创建它们,然后部署到该服务器上的其他数据库。我们在 MSSQL 和 Sybase 数据库上使用 L
我已经将 Liquibase 添加到我的应用程序中,这是一个在 JBoss EAP 6 上运行的 EAR。我使用 Maven 作为构建工具。我想知道运行 Liquibase 更新的首选方式是什么。目前
我需要制作一个 Liquibase 迁移脚本,仅当主键尚未添加时才将主键添加到数据库表。执行此操作的最佳方法是什么?它将是这样的: (What goes here? Should I
我在现有的变更日志文件中添加了一些新的变更集,并且只想执行新插入的变更集中的 2 个。当我在 liquibase 中给出更新命令时,它会更新所有未读的变更集并更新数据库。但是我只想执行变更日志文件中这
我发现 liquibase 使用更改日志文件的完整路径来计算校验和。 此行为限制修改更改日志文件名,并在重命名文件后尝试再次重新应用更改集。 有没有办法将 liquibase 配置为仅使用更改日志 I
我的数据库中有一个序列,是通过 Liquibase 生成的。在重构过程中,我们决定不喜欢我们给它起的名字,我们想重命名它,保留当前存在的所有数据。 alter a sequence 似乎有可能,但我没
我想更新名为“password”的列的类型。目前它有 NVARCHAR(40) 类型,我希望它是 NVARCHAR(64) 类型。这就是我所做的: 还需要做什
我正在创建一个包含 3 列的链接表; id、product_id、锦标赛id。 向“id”列添加 uniqueConstraint 是微不足道的,但我想确保任何一对 (product_id, tour
我正在尝试使用liquibase插入标签插入数据。当我在value标签中输入数字时,它可以正常工作。 但是我正在寻找一个简单的功能,即使我没有将其作为表定义的一部分,它也可以处理默认日期(数据库的当前
我正在尝试根据特定日期回滚数据库。 liquibase rollbackToDate 2013-05-14 10:13:16 它抛出以下错误: Error:Unexpected date/time f
我是一名优秀的程序员,十分优秀!