我正在使用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>
这是我的项目结构:
当我启动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作为数据的变更集的一部分执行它们,而不是依赖于单个文件。需要改变。
答案 0 :(得分:4)
我认为您的变更集3中存在两个问题:
path
属性的值指向不存在的资源。当您定义relativeToChangelogFile="true"
时,Liquibase会查找classpath:/db/changelog/src/main/resources/.../states.sql
。正确的路径应为path="../data/states.sql"
。dbms
属性。您的变更集应该适用于H2数据库。由于type name错误,它不应该与PostgreSQL数据库一起使用。请改为dbms="h2, postgresql"
。在这些更改之后,我根据您的项目结构得到了一张填充表。
答案 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.xml
和 src/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>