IntelliJ IDEA 2025.1 Help

Liquibase

要启用相应功能,请确保项目包含 Liquibase 依赖项。 它还提供了一系列操作,可以快速生成更改日志、运行它们、预览 SQL 语句等。

<dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId> </dependency>
dependencies { implementation 'org.liquibase:liquibase-core' }
dependencies { implementation("org.liquibase:liquibase-core") }

初始化 schema

使用 IntelliJ IDEA ,您可以根据 JPA 实体中提供的映射来初始化数据库架构。 它将为您当前的实体生成一组 DDL 命令,以 Liquibase 更改日志 的形式呈现。

  1. 请按 Ctrl+Shift+A 并开始输入 Liquibase 初始化架构

    您还可以打开一个 Liquibase 更改日志 文件,按 Alt+Insert ,然后选择 Liquibase 初始化架构。 在这种情况下,打开的文件参数将用于 更新日志预览窗口

  2. 要基于数据模型生成 DDL 脚本,请选择 模型 并指定相应的持久性单元。

    初始化 schema 变更日志

    IntelliJ IDEA 提供了一个专门针对所选实体更改创建迁移脚本的选项。 在 范围 列表中,点击 所选实体 ,然后在 选择自定义作用域的实体 窗口中,选择实体。

    自定义作用域

更新日志预览窗口

changelog-preview

如果您想将变更日志保存为常规文件,那么以下配置选项将可用:

  • 目录文件名 字段负责配置生成的更改日志的位置。 如果已存在具有指定名称的更改日志,您将收到一个警告提示,然后更改将被追加到该更改日志中。

  • 您可以使用 包含到包含文件夹包含上下文 来指定是否应在另一个 更改日志 中包含变更日志。 如果您勾选 包含文件夹 框,它会生成整个文件夹的 include 语句,而不仅仅是当前的 更改日志。

  • 文件类型 下拉列表中,您可以选择 Liquibase 支持的四种文件类型之一(YAML、JSON、SQL、XML),IntelliJ IDEA 将在这些文件中生成变更日志。

如果您希望将变更日志保存为临时文件,那么您只能配置其名称和类型。

liquibase-preview-scratch

窗口的左侧显示将生成的更改集预览。 您可以点击每个更改以查看其外观。 要将多个更改合并到一个更改集中或忽略它们,只需拖放即可。 预览窗口的左上角包含各种用于修改最终变更日志的操作:

add-changelog-action

提供以下操作:

  • 添加更改日志 — 创建次要更新日志

  • 添加变更集 — 在选定的更改日志中创建一个新的更改集

  • 从更改日志中移除 具有以下选项:

    • 从更改日志中移除 — 只需从当前变更日志中删除更改

    • 移除并忽略 — 移除这些更改并将其添加到 已忽略 ,这样它们也可以从未来的变更集中排除

    • 从忽略状态还原 — 将更改从 已忽略 移动到更改日志

  • 设置上下文 (用于更改集)

  • 设置标签 (用于更改集)

  • 显示其他操作 — 根据危险等级选择所有更改,展开/折叠所有更改

创建空变更日志

  1. 项目 工具窗口中,右键点击 db/changelog 目录。

  2. 选择 新建 (或按 Alt+Insert )并选择 Liquibase 空更改日志

    Liquibase 空变更日志
  3. 在打开的 新建 Liquibase 更改日志 对话框中,选择 XML 或 YAML 格式的变更日志文件。

    这将基于 Liquibase 文件模板创建一个新文件。 您可以在 IDE 设置(Ctrl+Alt+S )中的 编辑器 | 文件和代码模板 下查看所有可用的文件模板。

IntelliJ IDEA 为您提供 XML 和 YAML Liquibase changelog 文件的编码支持,包括针对 Liquibase 架构的验证、已知参数的建议,以及导航到属性声明和 included files

主要和次要更新日志

IntelliJ IDEA 允许您将变更记录分为两类:主要和次要。 一种用例是分离可以自动运行的安全更改与需要您注意且手动运行的更改。

可以按类型自动分隔更改(在 工具 | 数据库版本控制 | 差异变更 中)。 或者,您可以使用 添加更改日志 操作在“预览”窗口中手动创建次要更改日志。 然后,您可以简单地将所需的变更集拖到新的变更日志中。

默认情况下,Primary 和 Secondary 变更日志会生成在不同的目录中,您可以在插件设置中进行自定义。 请在 工具 | 数据库版本管理 | Liquibase 部分的 IDE 设置中了解更多信息。

生成迁移脚本

  1. 如果未建立数据库连接, 创建一个

  2. 数据库 工具窗口中,右键点击数据库并选择 创建 Liquibase 更改日志

    从数据库创建 JPA 实体

    或者,在编辑器中打开一个 JPA 实体并执行以下操作之一:

    • 点击 JPA 实体图标 中的标记并选择 创建 Liquibase 更改日志

    • 将文本光标置于实体上,按 Alt+Enter 调出意图操作,然后选择 创建 Liquibase 更改日志

  3. 在打开的对话框中,选择源(数据模型的期望状态)和目标(数据模型的旧状态)。

    您可以在以下源选项之间进行选择:

    • 数据库 :应在您拥有最新数据库并希望生成迁移脚本以将另一个数据库更新到相同状态时使用。

    • 模型 :使用它来生成迁移脚本,以表示当前实体关系模型(JPA 实体)与旧(目标)状态之间的差异。

    目标可以设置为:

    • 数据库 — 目标数据库的架构版本较旧。

    • 快照 — 如果您想要的状态存储在数据模型快照中,请使用此选项。 它也可以由 IntelliJ IDEA 生成。

  4. 点击 OK。 IntelliJ IDEA 将分析 Source 和 Target 之间的差异,并显示 更改日志预览 对话框。

    如果您想将变更日志保存为常规文件,那么以下配置选项将可用:

    • 目录 字段中,指定您想要保存更改日志文件的位置。

    • 文件名 字段中,输入生成的变更日志文件的名称。

    • 您可以使用 包含到包含文件夹包含上下文 来指定是否应在另一个变更日志中包含变更日志。 如果您选中 包含文件夹 复选框,它会为整个文件夹生成 include 语句,而不仅仅是当前的 更改日志。

    • 文件类型 列表中,您可以选择 Liquibase 支持的四种文件类型之一(YAML、JSON、SQL、XML),IntelliJ IDEA 将在其中生成更新日志。

    如果您想将变更日志保存为临时文件,请在 草稿文件更改日志预览 对话框顶部选择并指定其名称和类型。

    changelog-preview

无需 Gradle/Maven 插件运行 Liquibase 更改日志

JPA 结构选项卡还提供了一种运行 Liquibase 更新和预览 SQL 的方法。 要运行更新,请点击 Liquibase 更新 按钮

  1. 数据库 工具窗口中,右键点击数据库并选择 Liquibase 更新

    或者,按 Ctrl+Shift+A 并键入 Liquibase 更新

  2. 在打开的 Liquibase 更新 对话框中,配置以下参数:

    • 更改日志文件的路径

    • 使用的数据库连接

    • Liquibase context 和 labels

    • 操作的日志级别

    liquibase-update
  3. 点击 更新 以运行配置选项的 Liquibase update 命令。

    您还可以点击 显示 SQL 显示 SQL 语句预览。

    sql-preview

使用结构工具窗口浏览更改日志

如果您的 Liquibase 更改日志文件中有许多更改集, 逻辑视图结构 工具窗口可以帮助您快速预览文件并浏览其中的内容。 它将更改类型显示为单独的节点,您可以展开这些节点以获取更多详细信息。

逻辑视图适用于 XML 和 YAML 更改日志文件。

  1. 在编辑器中打开您的更改日志文件后,打开 结构 工具窗口: 查看 | 工具窗口 | 结构

    或者按 Alt+7

  2. 结构 工具窗口中,打开 逻辑 选项卡。

    点击任意更改以导航到更改日志文件中的定义。 对于 includeincludeAll 标签,您将被重定向到包含文件中的更改集。

结构工具窗口

Liquibase 设置

liquibase-settings

基础设置

IntelliJ IDEA 允许您指定:

  • 您要使用的 Liquibase 版本

  • 更改集作者名称

  • 默认文件类型。 支持以下四种文件类型:

    • XML

    • SQL

    • YAML

    • JSON

更改日志模板

每当创建空的或增量的 Liquibase 更改日志 时,IntelliJ IDEA 会根据模板生成文件名。 您可以配置主/副目录和变更日志的名称。

以下变量和宏可用于精确配置:

  • #date([format]) -指定的 SimpleDateFormat中的当前系统日期。 例如, #date(\"yyyy-MM-dd\") 返回格式化为 2020-12-31 的日期。

  • #increment([start], [step], [decimalFormat]) — 一个用于保持名称唯一的号码。 start 值用于第一个文件,并且每个下一个文件都根据 step 递增。 decimalFormat 参数指定了该数字的 DecimalFormat。 例如, #increment(1.0, 0.1, \"#.0\") 返回的值格式为 1.1、1.2、1.3 等。

  • semVer——项目的语义版本(又称 SemVer)是一种广泛采用的版本方案,使用三个数字(Major.Minor.Patch)序列、一个可选的预发布标签和一个可选的构建元标签。 该对象包含以下方法(示例中的完整版本为 1.2.3-SNAPSHOT+meta):

    • ${semVer.getRawVersion()} :1.2.3-SNAPSHOT

    • ${semVer.getMajor()} :1

    • ${semVer.getMinor()} :2

    • ${semVer.getPatch()} :3

    • ${semVer.getPreRelease()} :SNAPSHOT

    • ${semVer.getMeta()} :元数据

数据库类型

有时软件必须支持几种 DBMS 类型。 在这种情况下,Liquibase 是最佳选择,因为它提供了一个跨数据库的解决方案来声明 DDL 修改。 IntelliJ IDEA 也支持此解决方案。 在生成跨数据库变更日志时,它使用 Liquibase 属性来为每个 DBMS 指定正确的数据类型:

<property name="string.type" value="varchar" dbms="postgresql"/> <property name="string.type" value="nvarchar" dbms="mssql"/> <changeSet id="1622118750064-2" author="jpa-buddy"> <createTable tableName="owners"> <column autoIncrement="true" name="id" type="INT"> <constraints nullable="false" primaryKey="true" primaryKeyName="PK_OWNERS"/> </column> <column name="first_name" type="${string.type}(255)"/> <column name="last_name" type="${string.type}(255)"/> <column name="address" type="${string.type}(255)"/> <column name="city" type="${string.type}(255)"/> </createTable> </changeSet>

因此,无需为不同的 DBMS 创建单独的变更日志。

更改集模板

变更集模板是使用 Liquibase 指定数据库模式更改的预定义结构,提供了标准化格式。 这些模板作为创建一致且可重用的改动集的基础,确保数据库部署中的统一性和易于维护。

IntelliJ IDEA 提供在生成变更集时应用模板的功能。 此功能提供了在其中包含各种可自定义元素的能力:

  1. 将空的回滚添加到不支持隐式回滚的变更集中——此选项会自动向任何新的变更集 缺少隐式回滚的变更集中添加一个带有 TODO 注释的空回滚标签。

  2. failOnError 和 runOnChange:IntelliJ IDEA 支持 changeSet 标签内的常用属性,允许用户设置 failOnErrorrunOnChange 的默认值。

  3. 创建前置条件——每个变更集都可以有具体的前置条件。 例如,将为 tableExistscolumnExists 前提条件标签添加到 addColumn 语句:

<changeSet id="1685085536452-1" author="jpa-buddy"> <preConditions> <tableExists tableName="customer"/> <not> <columnExists tableName="customer" columnName="id"/> </not> </preConditions> <addColumn tableName="customer"> <column name="id" type="BIGINT"> <constraints nullable="false" primaryKey="true" primaryKeyName="pk_customer"/> </column> </addColumn> </changeSet>

请注意,某些 Liquibase changesets 可能不提供此选项。 例如,标签 procedureExists 不适用于 createProcedure 语句。

changeset-templates.png

以下是展示启用所有四个功能的删除表变更集的示例:

<changeSet id="1680594632747-1" author="jpa-buddy" runOnChange="true" failOnError="true"> <preConditions> <tableExists tableName="customer"/> </preConditions> <dropTable tableName="customer"/> <rollback><!--TODO--></rollback> </changeSet>

JPA Buddy 功能

您可以安装 JPA Buddy 插件,以获得对 Liquibase 的更多支持:

JPA 设计器

JPA 设计器 工具窗口允许您生成和修改代码。

在工具窗口(JPA Palette)的上部,选择一个操作,例如, 创建 ,然后双击一个元素,例如,

工具窗口的下半部分(JPA Inspector)会根据所选的变更日志元素进行调整,例如 changeSet,并允许您修改其属性。

要了解有关 JPA Designer 的更多信息,请参阅 实体设计器

JPA 设计器

编辑器工具栏

编辑器工具栏提供对相关操作的快速访问。 包括:

  1. 在 JPA 结构中选择已打开文件的操作

  2. JPA Palette 中的所有操作

  3. 初始化架构更改日志操作

  4. 差异更改日志操作

jpa-palette-db-actions

JPA Buddy 理解您的数据模型,并尽可能预填更改集。 借助 JPA Inspector,您可以查看每个 更改日志 元素的属性:

liquibase-changelog-preview
最后修改日期: 2025年 4月 24日