Liquibase 格式的 SQL 更改日志和多个文件

Posted

技术标签:

【中文标题】Liquibase 格式的 SQL 更改日志和多个文件【英文标题】:Liquibase formatted SQL changelogs and multiple files 【发布时间】:2018-04-06 07:17:22 【问题描述】:

我们开始在 spring-boot 上为我们的应用程序使用 liquibase。其中一项要求使用普通的 sql 作为 liquibase。我们有许多用于初始化数据库的 sql 文件。我检查了文档https://www.liquibase.org/documentation/sql_format.html,但没有找到如何创建更改日志 sql 文件的层次结构的信息。 Spring Boot 属性liquibase.change-log 等待单个文件。我试图用,; 分隔文件名,总是从spring-boot 得到错误找不到更改日志位置... 所以我的问题: 如何声明执行另一个或多个“sql 格式”文件?? 类似于 xml 等效项:<include file="second_changelog.sql"/> <include file="third_changelog.sql"/>

无效示例first_changelog.sql :--liquibase formatted sql --changeset author_1:1 UPDATE [dbo].[customers] SET name='HD_1' WHERE id = '11'; --import file=second_changelog.sql --import file=third_changelog.sql

PS。请不要建议xml,因为我只需要SQL

【问题讨论】:

【参考方案1】:

您可以使用一个包含对普通 sql 的多个引用的 XML 文件(详情请参阅https://www.liquibase.org/documentation/changes/sql_file.html)

例子:

<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-3.3.xsd">

    <changeSet id="init" author="author">
        <sqlFile encoding="utf8" path="first_changelog.sql"/>
        <sqlFile encoding="utf8" path="second_changelog.sql"/>
    </changeSet>

【讨论】:

谢谢,但由于要求不接受。我只需要普通的 sql 更改日志文件。【参考方案2】:

所以,

您似乎不想使用一个大格式的 SQL 变更日志,其中每个变更集都写入文件中。相反,如果您想拥有指向的单独 SQL 文件(使用普通 SQL),则需要有一个仅触碰一次的变更日志,如下所示:

<changeLog><includeAll path="/path/to/your/sql/directory"></changeLog>

使用includeAll告诉 Liquibase 拉入您指向的目录中的所有 SQL 文件,就好像它们是单独的变更集一样。见:http://www.liquibase.org/2015/09/liquibase-without-changelogs.html

【讨论】:

【参考方案3】:

功能请求仍处于打开状态,解决方案为“尚无计划” 请查看以下链接以获取更多讨论: http://forum.liquibase.org/topic/can-we-include-a-file-in-rollback

Jira 中的功能请求 ID: https://liquibase.jira.com/browse/CORE-1637

【讨论】:

【参考方案4】:

我使用了下面的结构,@Yuriy 的回答会将 sql 文件作为更改集(不是 sql 文件中定义的更改集)。

<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-3.3.xsd">
  <include file="changelog.sql"/>
<include file="changelog2.sql"/>
</databaseChangeLog>

进一步的 changelog.sql(s) 如下所示。这样 liquibase 也会考虑 sql 变更集。

--liquibase formatted sql

--changeset nvoxland:1

CREATE TABLE department_1   
(    
     DeptID int NOT NULL PRIMARY KEY CLUSTERED  
   , DeptName varchar(50) NOT NULL  
   , ManagerID INT  NULL  
   , ParentDeptID int NULL  
   , SysStartTime datetime2 GENERATED ALWAYS AS ROW START NOT NULL  
   , SysEndTime datetime2 GENERATED ALWAYS AS ROW END NOT NULL  
   , PERIOD FOR SYSTEM_TIME (SysStartTime,SysEndTime)     
)    
WITH (SYSTEM_VERSIONING = ON)   
;  
--rollback drop table department_1;

【讨论】:

【参考方案5】:

使用主 XML 文件从多个文件加载 sql 变更集。

<?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-3.8.xsd">
    <includeAll path="sql/"/>
</databaseChangeLog>

现在您可以将所有 .sql 文件存储在 sql 目录中。甚至它也会从子目录中读取。

【讨论】:

以上是关于Liquibase 格式的 SQL 更改日志和多个文件的主要内容,如果未能解决你的问题,请参考以下文章

sql 当Liquibase因取消运行而无法获取更改日志时

Liquibase 校验和验证失败

Liquibase 无法找到用于 4.0 及更高版本的集成测试的更改日志文件

Liquibase 根据表名前缀在 db 上生成更改日志

如何使用 jar 文件中的 Liquibase 更改日志

markdown Liquibase:等待更改日志锁...