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

4
我们开始在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。

5个回答

9
你可以使用一个XML文件,其中包含对普通SQL的多个引用(详见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 变更日志文件。 - borino

5

所以,看起来你不想使用一个大的格式化的SQL changelog文件,在其中每个changeset都写在文件中。相反,如果你想要单独的SQL文件,并且可以指向它们(使用纯SQL),那么你需要一个只修改一次的changelog文件,它应该如下所示:

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

使用includeAll告诉Liquibase将目录中的所有SQL文件作为单独的changeSets导入。请参见:http://www.liquibase.org/2015/09/liquibase-without-changelogs.html 附注:根据您的项目,您可能需要考虑使用Datical,它是建立在Liquibase之上的商业解决方案,可以使这一切变得更加容易。您只需要将SQL文件检入源代码控制,Datical就有一个代码打包程序,可以验证并生成数据库更改的不可变artifact。您可以完全退出管理changeLog的业务。

2
使用主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目录中。它甚至可以从子目录中读取。

1
我使用了以下结构,@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 如下所示。这样,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;

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接