Liquibase没有使用Spring Boot获取种子数据

时间:2015-03-10 12:54:10

标签: spring-boot liquibase

我正在使用Spring-Boot 1.2.1和Liquibase创建H2(测试)和PostgreSQL(QA& Production)数据库。创建数据库时,我想要种子几个表。但是,尽管尝试了dataLoad和sqlFile,但没有插入任何内容。我的sql文件只是一堆插入语句,如:

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>

这是我的项目结构: enter image description here

当我启动spring-boot应用程序时,我可以看到State表已创建,但它的行数为零。我也尝试从变更集3中取出并使用它:

  <changeSet id="4" author="me">
            <loadData file="data/state.csv" tablename="STATE" schemaName="edentalmanager" relativeToChangelogFile="true">
            <column name="name" type="VARCHAR(100)"/>
            <column name="code" type="VARCHAR(10)"/>
            </loadData>
        </changeSet>

csv文件基本上是:

Alabama,AL
Alaska,AK
...

我不会&#39;查看Liquibase尝试创建的控制台日志中的任何消息或将数据插入表中。我也没有得到任何例外或错误消息。

更新: 如果我将state.sql复制为/resources/data.sql,那么spring-boot会选择文件并执行sql就好了。不幸的是,这意味着每次启动时,它都会尝试再次插入这些值,导致启动异常(重复密钥违规)但是,我宁愿使用Liquibase作为数据的变更集的一部分执行它们,而不是依赖于单个文件。需要改变。

3 个答案:

答案 0 :(得分:4)

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

  1. path属性的值指向不存在的资源。当您定义relativeToChangelogFile="true"时,Liquibase会查找classpath:/db/changelog/src/main/resources/.../states.sql。正确的路径应为path="../data/states.sql"
  2. 如果给定的路径不正确,Liquibase应该抛出异常。如果你没有得到一个意味着Liquibase决定不执行该部分因为其他条件。其中一个条件可能是dbms属性。您的变更集应该适用于H2数据库。由于type name错误,它不应该与PostgreSQL数据库一起使用。请改为dbms="h2, postgresql"
  3. 在这些更改之后,我根据您的项目结构得到了一张填充表。

答案 1 :(得分:1)

这是因为默认情况下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不要对数据库架构执行任何操作:

spring.jpa.hibernate.ddl-auto=none

答案 2 :(得分:1)

我在从 2.4.1 版本升级到 spring boot 2.2.0-RELEASE 时遇到了这个问题。 2.2.0-RELEASE 版本将 liquibase-core:jar:3.8.0 作为依赖项,它准确地采用了 relativeToChangelogFile="true"。然而,2.4.1 版本有 liquibase-core:jar:3.10.3 版本,它破坏了 loadData 功能。

我正在加载的 csv 文件和 changelog.xml 文件在我的案例 src/main/resources/liquibase/version2/changelog.xmlsrc/main/resources/liquibase/version2/xref_specialty_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>

我加载了一个层次结构的更改日志文件,顶部位于 src/main/resources/liquibase/changelog.xml,布局如下。

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