首页 > 解决方案 > 如何摆脱带有格式化.sql 变更集错误的 Liquibase includeAll 标记:找不到元素“databaseChangeLog”的声明

问题描述

我正在使用带有 liquibase 的 Gradle Spring 项目。要运行 liquibase,我正在运行通过编译项目创建的 jar。我正在尝试在 xml 更改日志中使用 liquibase“includeAll”标记来运行我称为 includeAllScriptsTest 的目录中的所有格式化的 sql 更改日志脚本(当前仅包含一个名为 test.sql 的 .sql 文件和一个更改集)。

如果我尝试在我的主 db-changelog 文件中使用 includeAll,则在运行时 liquibase 会返回错误:file:///.../conf/db/db.changelog-master.xml/ 不是可识别的文件类型。

为了解决这个问题,我从我的 db-changelog-master.xml 中引用了另一个名为 includeAll-changelog.xml 的 xml。在这个文件中,我有 includeAll 标签,下面是这个文件的内容。

<?xml version="1.0" encoding="utf-8"?>
<databaseChangeLog 
        xmlns="https://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog conf/xsd/dbchangelog-3.8.xsd">
    <includeAll path="***/includeAllScriptsTest/" relativeToChangelogFile="true"/>
</databaseChangeLog>

在文件夹 includeAllScriptsTest 中有一个名为 test.sql 的文件,其内容如下:

--liquibase formatted sql
--changeset author:1  dbms:MySQL splitStatements:true endDelimiter://

DROP PROCEDURE IF EXISTS `TESTINCLUDEALL`;//

CREATE PROCEDURE `TESTINCLUDEALL`()

BEGIN

SELECT * FROM TABLE;
END;//

但是,这在运行时给了我一个不同的错误:cvc-elt.1.a:找不到元素“databaseChangeLog”的声明。我发现有关是否可以将 includeAll 与我的项目使用的 liquibase 版本一起使用的在线信息存在冲突。我目前正在使用 3.4.1。

标签: mysqldatabaseliquibase

解决方案


cvc-elt.1.a:找不到元素“databaseChangeLog”的声明

此错误是 XML 解析错误,databaseChangeLog未在 xml 模式中声明指向。

也许您可以尝试在更改日志中使用以下 XSD:

<?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="***/includeAllScriptsTest/" relativeToChangelogFile="true"/>
</databaseChangeLog>

如果这仍然没有帮助,请在这篇文章中查看几点回答。


推荐阅读