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

时间:2018-04-06 07:17:23

标签: java spring spring-boot liquibase

我们开始在弹簧靴上使用liquibase进行应用。其中一个要求使用普通的sql来进行liquibase。我们有许多用于初始化数据库的sql文件。我查看了文档https://www.liquibase.org/documentation/sql_format.html但未找到信息如何创建更改日志sql文件的层次结构。等待单个文件的Spring引导属性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 个答案:

答案 0 :(得分:3)

所以,

似乎您不想使用一个大的格式化SQL更改日志,其中每个更改集都写在文件中。相反,如果您想要使用单独的SQL文件(使用纯SQL),则需要一个只触及一次的更改日志,如下所示:

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

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

P.S。:根据您的项目,您可能需要查看Datical - 这是一个基于Liquibase构建的商业解决方案,使这一切变得更加容易。您只需要将SQL文件签入到源代码控制中,而Datical有一个代码打包器,可以验证并生成数据库更改的不可变工件。您可以完全放弃管理changeLog的业务。

答案 1 :(得分:2)

您可以使用一个XML文件,其中包含对plain sql的多个引用(有关详细信息,请参阅enter image description here

示例:

<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>

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

我使用以下结构,@Yuriy的Answer将以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;

答案 4 :(得分:0)

使用主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 目录中。即使是它也会从子目录中读取。