【发布时间】:2015-05-11 22:09:14
【问题描述】:
我正在使用 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 应用程序时,我可以看到 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
...
我在控制台日志中没有看到 Liquibase 正在尝试创建数据或将数据插入表中的任何消息。我也没有收到任何异常或错误消息。
更新: 如果我将 state.sql 复制为 /resources/data.sql 然后 spring-boot 会拿起文件并执行 sql 就好了。不幸的是,这意味着每次我启动时,它都会尝试再次插入这些值,从而导致启动异常(重复键违规)但是,与其依赖单个文件,我更希望 Liquibase 将它们作为变更集的一部分作为数据执行需要改变。
【问题讨论】:
-
没有其他人有这个文件没有被 Liquibase 加载的问题吗?
-
当您将应用程序打包到 JAR/WAR 时,path
src/main/resources/db/changelog/data/states.sql无法工作。理想情况下,如果 liquibase 可以从类路径读取文件但在文档中找不到它
标签: spring-boot liquibase