当前位置: 首页 > 知识库问答 >
问题:

如何在Spring boot应用中使用Liquibase更新数据库?

司马自明
2023-03-14

我在spring-boot应用程序中为数据库配置了以下liquibase配置。

最初,这些YAML脚本是在应用程序启动和数据库创建时执行的,现在我想更新一列的数据类型,所以我需要更新现有的创建表。列配置的YAML,或者需要创建另一个具有不同名称的文件,并将条目添加到“db.changelog-master.yaml”文件中。

请建议,谢谢

共有2个答案

仰雅昶
2023-03-14

正如你在这里看到的,

Liquibase为您的数据库提供版本控制

,Liquibase如此流行的主要原因是它允许对数据库应用某种类型的版本控制。

为了能够做到这一点,您需要始终将数据库中的更改记录到更改日志中。

所以Liquibase项目的一个例子将有

> < Li > < p > create-initial-tables-changelog . XML

更新架构-10-5-22.更改日志.xml

更新-数据-15-5-22.changelog.xml

update-schema-10-6-22 . changelog . XML

更新数据-15-6-22.更新日志.xml

每个包含更改的更改日志文件都可以根据主要更改的表示进行命名(此处使用日期只是为了简化)。

然后用户可以使用版本管理系统(如git),例如当用户签出过去的提交(例如2022年5月15日的提交)时,他就能够查看该版本上的数据库,因为liquibase将只执行该提交上存在的脚本,即create-initial-tables-changelog.xmlupdate-schema-10-5-22.changelog.xmlupdate-data-15-5-22.changelog.xml

此外,所有变更日志文件都需要在特定版本的主变更日志文件中引用,因为该文件用于在要求时执行数据库中的脚本。

主变更日志文件作为一个配置文件工作,它将保存对所有其他变更日志的所有引用。您的主changelog文件必须是XML、YAML或JSON格式。来自文档

说了以上所有的话现在我可以回答你的问题了

我是否需要更新现有的创建表。YAML与列配置或需要创建另一个不同名称的文件

使用Liquibase的主要原因可能是对数据库进行版本控制。如果您希望尊重这个原因,那么您必须创建一个不同的变更日志文件,该文件将是与现有初始版本不同的数据库版本的快照。

此外,例如,如果您有初始的创建表更改日志.xml然后您还有 3 个在数据库中应用更改的 changelog.xml 文件,则您不能只在创建表更改日志中进行更改.xml因为这将冒着执行接下来的 3 个文件 changelog1.xml、changelog2.xml、changelog3.xml 会中断的风险。

呼延智明
2023-03-14

您必须创建不同的更改日志,并需要添加到主文件中

使用Liquibase的最佳实践

组织变更日志:创建一个主变更日志文件,该文件没有实际的变更集,但包括其他变更日志(只有使用包含的YAML、JSON和XML支持,SQL不支持)。这样做允许我们在不同的变更日志文件中组织我们的变更集。每次我们向需要数据库更改的应用程序添加新功能时,我们都可以创建一个新的变更日志文件,将其添加到版本控制中,并将其包含在主变更日志中。

每个变更集一个变更:每个变更集只有一个变更,因为这允许在应用变更集失败时更容易回滚。

不要修改变更集:一旦变更集被执行,永远不要修改它。相反,如果现有变更集应用的更改需要修改,则添加新的变更集。Liquibase跟踪它已经执行的变更集的校验和。如果已经运行的变更集被修改,Liquibase默认情况下将无法再次运行该变更集,并且不会继续执行其他变更集。

test_schema.sql

--liquibase formatted sql
--changeset test_user:test_schema splitStatements:true endDelimiter:; dbms:postgresql runOnChange:true runInTransaction:true context:dev, qa, prod logicalFilePath:schema/test_schema.sql
--preconditions onFail:HALT onError:HALT
--comment test_schema is added

CREATE TABLE test_data
(
    test_id            bigint PRIMARY KEY,
    test_data          character varying(100),
    created_time       timestamp with time zone,
    last_modified_time timestamp with time zone
);

changelog-master.xml

<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
                      http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.3.xsd">
    <include file="schemas/test_schema.sql" relativeToChangelogFile="true"/>
</databaseChangeLog>

苏尔 : https://reflectoring.io/database-migration-spring-boot-liquibase/

 类似资料:
  • 当使用liquibase maven更新目标执行更新时,我得到了以下错误。 LiquiBase.Exception.ChangeLogParseException:解析db.changeLogDiff.xml的第4459行第108列时出错:cvc-complex-type.3.2.2:属性“Object QuotingStrategy”不允许出现在元素“Change Set”中。 diff生成的c

  • 我刚刚在AWS中创建了一个DB MySQL 5.6.40。我可以使用Sequel Pro 1.1.2连接到DB 这是我在pom中的配置。xml文件: 但是当我运行mvn clean package-DskipTests时 我得到了这个错误: 错误]无法执行目标组织。liquibase:liquibase maven插件:3.5.3:updateSQL(默认)on project icrypts:E

  • 使用liquibase和springboot,创建了数据库变更日志,并能够用maven-liquibase-plugin(mvn liquibase:update)成功地运行它。我正在编写集成测试,其中需要以编程方式创建liquibase更改。 运行上述测试时出现以下异常。 java.lang.IllegalStateException:在org.springframework.test.cont

  • 我一直试图将这个(https://github.com/liquibase/liquibase-redshift/releases)插件用于我的Redshift数据库,但一直未能使其工作。我主要面临两个问题。 无效操作:“tag”处或附近有语法错误。通过手动创建databasechangelog表,我解决了这个问题。 将记录插入databasechangelog表时出错,原因是LB在insert查

  • 问题内容: 我希望有人可以验证这是否是使用liquibase填充数据库的正确语法和正确方法吗?所有,我想要的是更改表中一行的值,而我这样做是这样的: 我想要的只是在某个表中的一行中更改一个值。上面的方法不起作用,尽管应用程序已编译并且没有抱怨,但是可惜的是,该值没有改变。 谢谢 问题答案: 对的,这是可能的。请参见以下语法: Liquibase更新中的更多信息

  • 我们仍处于项目的早期阶段,我们正在构建一个包含多个表的数据库。列出的两个工具都允许我们创建一些DDL / DML文件并跟踪对数据库的更改。无论如何,当结构仍未合并时,这可能会很麻烦。 假设我想添加一个新列,甚至删除一个表:在这两个程序中,我都必须使用ALTER TABLE/etc.命令创建一个新脚本并记录更改。 在terraform中,您只需编写所需的基础设施,当您通过删除节点来更改文件时,该工具