我正在使用 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>
这是我的项目结构:
当我启动我的 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 中存在两个问题:
path
属性的值指向一个不存在的资源。当您定义relativeToChangelogFile="true"
时,Liquibase 将查找classpath:/db/changelog/src/main/resources/.../states.sql
。正确的路径应该是path="../data/states.sql"
。- 如果给定的路径不正确,Liquibase 应该抛出异常。如果你没有得到一个意味着 Liquibase 由于其他条件决定不执行该部分。其中一个条件可能是
dbms
属性。您的变更集应该使用 H2 数据库。由于错误 type name,它不应该与 PostgreSQL 数据库一起使用.请尝试dbms="h2, postgresql"
。
在这些更改之后,我得到了一个基于您的项目结构的填充表。
关于spring-boot - Liquibase 不使用 Spring Boot 获取种子数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28964264/