【问题标题】:How to get rid of Liquibase includeAll tag with formatted .sql changesets error: Cannot find the declaration of element 'databaseChangeLog'如何摆脱带有格式化.sql 变更集错误的 Liquibase includeAll 标记:找不到元素“databaseChangeLog”的声明
【发布时间】:2021-06-03 16:46:59
【问题描述】:

我正在使用带有 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。

【问题讨论】:

    标签: mysql database liquibase


    【解决方案1】:

    cvc-elt.1.a: 找不到元素的声明 '数据库更改日志'

    此错误是 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>
    

    如果这仍然没有帮助,请查看this post 上的几个答案。

    【讨论】:

    • 谢谢。除了将我的 liquibasecore 版本更改为最新版本 (4.3.5) 之外,我还需要 dbchangelog-4.0.xsd。之后我遇到了一些校验和错误,我通过在 endDelimter 语句后添加“runAlways:true”解决了这些错误。经过这些更改后,我可以毫无问题地使用它。
    猜你喜欢
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多