spring-boot - Liquibase 不使用 Spring Boot 获取种子数据

标签 spring-boot liquibase

我正在使用 Spring-Boot 1.2.1 和 Liquibase 创建 H2(测试)和 PostgreSQL(QA 和生产)数据库。我有几个表,我想在创建数据库时播种。然而,尽管尝试了 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 应用程序时,我可以看到状态表已创建,但其中有零行。我还尝试从变更集 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
...

我在控制台日志中没有看到 Liquibase 正在尝试创建数据或将数据插入表中的任何消息。我也没有收到任何异常或错误消息。

更新: 如果我将 state.sql 复制为/resources/data.sql,则 spring-boot 会拾取该文件并执行 sql 就好了。不幸的是,这意味着每次我启动时,它都会尝试再次插入这些值,从而导致启动异常(重复键违规)但是,与其依赖单个文件,我更希望 Liquibase 将它们作为变更集的一部分作为数据执行需要改变。

最佳答案

我认为您的变更集 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"

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

关于spring-boot - Liquibase 不使用 Spring Boot 获取种子数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28964264/

相关文章:

java - 为什么 liquibase 总是使用自己的序列?

liquibase - 防止生产中不必要的 liquibase 变更集的最佳实践

java - 如何在标准输出中禁用 Spring Boot Logo ?

java - Spring WebFlux 消费者接收器

java - 当 prometheus 端点调用时 MockMvc 收到 404

java - 在Jhipster中创建与用户(jhiUser)的实体关系

spring-boot - 组织.hibernate.HibernateException : No CurrentSessionContext configured with HSQL DB

java - Spring Reactive 测试用例启动 Netty 服务器失败

java - Liquibase 跳过生成的变更集

mysql - Liquibase 错误 : No inverse to liquibase. Change.core.RawSQLChange 创建