Spring boot Liquibase不使用Spring Boot拾取种子数据
我使用SpringBoot1.2.1和Liquibase创建H2(测试)和PostgreSQL(QA&Production)数据库。我有两个表,我想在创建db时为它们设定种子。然而,尽管尝试了dataLoad和sqlFile,但没有插入任何内容。我的sql文件只是一组insert语句,例如:Spring boot Liquibase不使用Spring Boot拾取种子数据,spring-boot,liquibase,Spring Boot,Liquibase,我使用SpringBoot1.2.1和Liquibase创建H2(测试)和PostgreSQL(QA&Production)数据库。我有两个表,我想在创建db时为它们设定种子。然而,尽管尝试了dataLoad和sqlFile,但没有插入任何内容。我的sql文件只是一组insert语句,例如: INSERT INTO state (Name, Code) VALUES('Alabama','AL'); INSERT INTO state (Name, Code) VALUES('Alaska','
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>
在控制台日志中,我没有看到Liquibase试图创建数据或将数据插入表中的任何消息。我也没有收到任何异常或错误消息
更新:
如果我将state.sql复制为/resources/data.sql,那么spring boot将拾取该文件并执行sql。不幸的是,这意味着每次启动时,它都会再次尝试插入这些值,从而导致启动异常(重复的密钥冲突),但是,与依赖单个文件相比,我更愿意在数据需要更改时将它们作为更改集的一部分执行。我认为您的更改集3中存在两个问题:
path
属性的值指向不存在的资源。定义relativeToChangelogFile=“true”
时,Liquibase将查找classpath:/db/changelog/src/main/resources/../states.sql
。正确的路径应该是path=“../data/states.sql”
dbms
属性。您的变更集应该与H2数据库一起使用。它不应该与PostgreSQL数据库一起工作,因为错误的。请尝试使用dbms=“h2,postgresql”
在这些更改之后,我得到了一个基于项目结构的填充表。这是因为默认情况下,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不要对DB架构执行任何操作:
spring.jpa.hibernate.ddl-auto=none
我从
2.2.0-RELEASE
版本升级到spring boot2.4.1
时遇到了这个问题。2.2.0-RELEASE
版本将liquibase-core:jar:3.8.0
作为依赖项,并准确地将relativeToChangelogFile=“true”
作为依赖项。但是2.4.1
版本具有liquibase核心:jar:3.10.3
版本,该版本破坏了loadData
功能
我正在加载的csv文件和changelog.xml
文件在我的案例中位于同一类目录中src/main/resources/liquibase/version2/changelog.xml
和src/main/resources/liquibase/version2/xref\u speciality\u 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>
没有其他人会遇到Liquibase没有加载文件的问题吗?path
src/main/resources/db/changelog/data/states.sql
在将应用程序打包到JAR/WAR时无法工作。理想情况下,如果liquibase可以从类路径中读取文件,但在文档中找不到它,Tinoi做了这两个更改,但仍然没有发生任何变化。我想如果找不到文件,Liquibase会抛出异常,但什么也找不到。我尝试在这个目录位置和参考资料中使用states.sql文件/(我更改了该文件的路径)。我在嵌入式Tomcat中运行这个程序,所以我想知道是否有办法告诉Liquibase只使用类路径?您真的需要dbms
属性吗?如果你移除它会发生什么?同样的行为。奇怪的是,日志中没有任何关于此的异常、消息或输出。您知道如何打开Liquibase的调试吗?我试过“logging.level.org.springframework.boot.liquibase.:DEBUG”,但似乎不正确,这很奇怪。。。日志记录的属性将是logging.level.liquibase
。如果在变更集中添加两个附加插入:一个在createTable和sqlFile之间,另一个在sqlFile之后,会发生什么情况?您应该至少会收到两条额外的日志消息(“将新行插入…”)。是否将liquibase core作为依赖项添加到项目中?在将Spring Boot升级到2.4.3后,我遇到了相同的问题。你现在解决了吗?没有。我回到了2.2.0版本。
spring.jpa.hibernate.ddl-auto=none
<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>
<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>