Spring boot Liquibase不使用Spring Boot拾取种子数据

Spring boot Liquibase不使用Spring Boot拾取种子数据,spring-boot,liquibase,Spring Boot,Liquibase,我使用SpringBoot1.2.1和Liquibase创建H2(测试)和PostgreSQL(QA&Production)数据库。我有两个表,我想在创建db时为它们设定种子。然而,尽管尝试了dataLoad和sqlFile,但没有插入任何内容。我的sql文件只是一组insert语句,例如: INSERT INTO state (Name, Code) VALUES('Alabama','AL'); INSERT INTO state (Name, Code) VALUES('Alaska','

我使用SpringBoot1.2.1和Liquibase创建H2(测试)和PostgreSQL(QA&Production)数据库。我有两个表,我想在创建db时为它们设定种子。然而,尽管尝试了dataLoad和sqlFile,但没有插入任何内容。我的sql文件只是一组insert语句,例如:

INSERT INTO state (Name, Code) VALUES('Alabama','AL');
INSERT INTO state (Name, Code) VALUES('Alaska','AK');
以下是我的相关changelog-master.xml:
    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"
    objectQuotingStrategy="QUOTE_ONLY_RESERVED_WORDS">

...
<changeSet id="3" author="me">
        <createTable tableName="STATE">
            <column name="code" type="VARCHAR(10)">
                <constraints primaryKey="true"/>
            </column>
            <column name="name" type="VARCHAR(100)"/>
        </createTable>

         <sqlFile dbms="h2, PostgreSQL"
                 encoding="utf8"
                 endDelimiter="\nGO"
                 path="src/main/resources/db/changelog/data/states.sql"
                 relativeToChangelogFile="true"
                 splitStatements="true"
                 stripComments="true"/>
    </changeSet>
在控制台日志中,我没有看到Liquibase试图创建数据或将数据插入表中的任何消息。我也没有收到任何异常或错误消息

更新
如果我将state.sql复制为/resources/data.sql,那么spring boot将拾取该文件并执行sql。不幸的是,这意味着每次启动时,它都会再次尝试插入这些值,从而导致启动异常(重复的密钥冲突),但是,与依赖单个文件相比,我更愿意在数据需要更改时将它们作为更改集的一部分执行。

我认为您的更改集3中存在两个问题:

  • path
    属性的值指向不存在的资源。定义
    relativeToChangelogFile=“true”
    时,Liquibase将查找
    classpath:/db/changelog/src/main/resources/../states.sql
    。正确的路径应该是
    path=“../data/states.sql”
  • 如果给定路径不正确,Liquibase应引发异常。如果你没有得到一个方法,Liquibase决定不执行该部分,因为其他条件。这些条件之一可能是
    dbms
    属性。您的变更集应该与H2数据库一起使用。它不应该与PostgreSQL数据库一起工作,因为错误的。请尝试使用
    dbms=“h2,postgresql”

  • 在这些更改之后,我得到了一个基于项目结构的填充表。

    这是因为默认情况下,Hibernate在初始化时会删除模式。所以首先Liquibase创建数据,当Hibernate完成时,它会删除表,并根据您定义的JPA实体重新创建它们

    您可以通过查找日志记录来验证这一点:

    2017-01-19 11:03:48.692  INFO 15161 --- [           main] org.hibernate.tool.hbm2ddl.SchemaExport  : HHH000227: Running hbm2ddl schema export
    
    通过设置以下应用程序属性,可以告诉Hibernate不要对DB架构执行任何操作:

    spring.jpa.hibernate.ddl-auto=none
    

    我从
    2.2.0-RELEASE
    版本升级到spring boot
    2.4.1
    时遇到了这个问题。
    2.2.0-RELEASE
    版本将
    liquibase-core:jar:3.8.0
    作为依赖项,并准确地将
    relativeToChangelogFile=“true”
    作为依赖项。但是
    2.4.1
    版本具有
    liquibase核心:jar:3.10.3
    版本,该版本破坏了
    loadData
    功能

    我正在加载的csv文件和
    changelog.xml
    文件在我的案例中位于同一类目录中
    src/main/resources/liquibase/version2/changelog.xml
    src/main/resources/liquibase/version2/xref\u speciality\u codes.csv

    下面是我的
    changelog.xml
    中的代码片段,用于加载不适用于更高版本liquibase的数据

    <changeSet author="anon"
                   id="xref_specialty_codes_load_data"
                   objectQuotingStrategy="LEGACY">
            <loadData catalogName="adb"
                      schemaName="public"
                      encoding="UTF-8"
                      file="xref_specialty_codes.csv"
                      relativeToChangelogFile="true"
                      separator=","
                      tableName="xref_specialty_codes"
                      usePreparedStatements="true">
                <column name="id" type="NUMERIC"/>
                ...
                ....
            </loadData>
        </changeSet>
    

    没有其他人会遇到Liquibase没有加载文件的问题吗?path
    src/main/resources/db/changelog/data/states.sql
    在将应用程序打包到JAR/WAR时无法工作。理想情况下,如果liquibase可以从类路径中读取文件,但在文档中找不到它,Tinoi做了这两个更改,但仍然没有发生任何变化。我想如果找不到文件,Liquibase会抛出异常,但什么也找不到。我尝试在这个目录位置和参考资料中使用states.sql文件/(我更改了该文件的路径)。我在嵌入式Tomcat中运行这个程序,所以我想知道是否有办法告诉Liquibase只使用类路径?您真的需要
    dbms
    属性吗?如果你移除它会发生什么?同样的行为。奇怪的是,日志中没有任何关于此的异常、消息或输出。您知道如何打开Liquibase的调试吗?我试过“logging.level.org.springframework.boot.liquibase.:DEBUG”,但似乎不正确,这很奇怪。。。日志记录的属性将是
    logging.level.liquibase
    。如果在变更集中添加两个附加插入:一个在createTable和sqlFile之间,另一个在sqlFile之后,会发生什么情况?您应该至少会收到两条额外的日志消息(“将新行插入…”)。是否将liquibase core作为依赖项添加到项目中?在将Spring Boot升级到2.4.3后,我遇到了相同的问题。你现在解决了吗?没有。我回到了2.2.0版本。
    spring.jpa.hibernate.ddl-auto=none
    
    <changeSet author="anon"
                   id="xref_specialty_codes_load_data"
                   objectQuotingStrategy="LEGACY">
            <loadData catalogName="adb"
                      schemaName="public"
                      encoding="UTF-8"
                      file="xref_specialty_codes.csv"
                      relativeToChangelogFile="true"
                      separator=","
                      tableName="xref_specialty_codes"
                      usePreparedStatements="true">
                <column name="id" type="NUMERIC"/>
                ...
                ....
            </loadData>
        </changeSet>
    
    <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd">
        <property name="now" value="now()" dbms="postgresql"/>
        <include file="src/main/resources/liquibase/version1/changelog.xml" />
        <include file="src/main/resources/liquibase/version2/changelog.xml" />
        ....
    </databaseChangeLog>