Flyway 与 Spring Boot 的集成不会在嵌入式 H2 数据库上执行迁移脚本
Posted
技术标签:
【中文标题】Flyway 与 Spring Boot 的集成不会在嵌入式 H2 数据库上执行迁移脚本【英文标题】:Flyway integration with spring boot doesn't execute migration scripts on embedded H2 database 【发布时间】:2018-10-17 08:14:30 【问题描述】:我正在尝试使用 Flyway 在 Spring Boot 应用程序中的嵌入式 H2 数据库上进行迁移演示。
application.properties
logging.level.org.org.springframework=DEBUG
server.port=8181
spring.h2.console.enabled=true
spring.h2.console.path=/h2
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver
spring.flyway.baseline-on-migrate=true
spring.jpa.hibernate.ddl-auto=none
db/migration 下的migration-script(V2__create_shipwreck.sql)
CREATE TABLE SHIPWRECK(ID INT AUTO_INCREMENT,
NAME VARCHAR(255),
DESCRIPTION VARCHAR(2000),
CONDITION VARCHAR(255),
DEPTH INT,
LATITUDE DOUBLE,
LANGITUDE DOUBLE,
YEARS_DISCOERED INT);
控制台日志
INFO 7284 --- [主要] o.f.c.internal.database.DatabaseFactory: 数据库:jdbc:h2:mem:testdb (H2 1.4)
INFO 7284 --- [main] o.f.core.internal.command.DbValidate: 成功验证 1 个迁移(执行时间 00:00.031s)
INFO 7284 --- [main] o.f.c.i.s.JdbcTableSchemaHistory:创建模式 历史表:"PUBLIC"."flyway_schema_history"
INFO 7284 --- [main] o.f.core.internal.command.DbMigrate:当前 架构“公共”的版本:>
INFO 7284 --- [main] o.f.core.internal.command.DbMigrate:迁移 架构“公共”到版本 2 - 创建沉船
INFO 7284 --- [主要] o.f.core.internal.command.DbMigrate : 已成功将 1 次迁移应用到架构“PUBLIC”(执行时间 00:00.098s)
信息 7284 --- [主要] j.LocalContainerEntityManagerFactoryBean : 为持久化单元构建 JPA 容器 EntityManagerFactory '默认'
INFO 7284 --- [主要] o.hibernate.jpa.internal.util.LogHelper : HHH000204:处理 PersistenceUnitInfo [名称:默认...]
main] org.hibernate.Version : HHH000412: 休眠 核心5.2.14.Final
main] org.hibernate.cfg.Environment : HHH000206: hibernate.properties 未找到
main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons 注解 5.0.1.Final
main] org.hibernate.dialect.Dialect : HHH000400: 使用 方言:org.hibernate.dialect.H2Dialect
main] j.LocalContainerEntityManagerFactoryBean : 初始化的 JPA 持久性单元“默认”的 EntityManagerFactory
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.boot</groupId>
<artifactId>das-boot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>das-boot</name>
<url>http://maven.apache.org</url>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>5.0.7</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.0.0.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
H2 数据库表界面
启动Spring Boot应用后,还没有创建表,请问这里有什么问题?
【问题讨论】:
请包含pom.xml
@LuayAbdulraheem 我已添加 pom.xml
您的日志是相反的:“将架构“PUBLIC”迁移到版本 2 - 创建沉船”和“成功将 1 次迁移应用到架构“PUBLIC”(执行时间 00:00.098 秒)”。您是如何检查迁移脚本中的表是否尚未创建的?
【参考方案1】:
我遇到了同样的问题,将 application.properties 更改为后解决了 datasource.url 到 file 而不是 mem
能够创建包含详细信息的表格
正确的:
spring.datasource.url=jdbc:h2:file:~/dasboot
application.properties
logging.level.org.org.springframework=DEBUG
server.port=8080
spring.h2.console.enabled=true
spring.h2.console.path=/h2
spring.datasource.url=jdbc:h2:file:~/dasboot
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver
spring.flyway.baseline-on-migrate=true
spring.jpa.hibernate.ddl-auto=none
POM.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.boot</groupId>
<artifactId>das-boot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<name>das-boot</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
shipwreck table was created and persisted in h2 db
【讨论】:
【参考方案2】:根据您的描述(Flyway 正确执行,但之后没有观察到架构更改),这听起来像 Spring Boot 不会持久化 H2 更改。您可以尝试将spring.jpa.hibernate.ddl-auto=none
添加到您的application.properties
,以便JPA 配置不会覆盖Flyway 迁移后的架构更改,如this question 所述。
【讨论】:
谢谢你的回复,我已经做了上面的,但还是一样。以上是关于Flyway 与 Spring Boot 的集成不会在嵌入式 H2 数据库上执行迁移脚本的主要内容,如果未能解决你的问题,请参考以下文章
Flyway Spring Boot应用程序在启动时不应用插入脚本
Spring boot 和 Flyway:集成测试前清除数据库数据
将 Flyway 设置为在 Spring Boot 中使用不同的环境