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:集成测试前清除数据库数据

Spring Boot集成Flyway实现数据库版本控制?

将 Flyway 设置为在 Spring Boot 中使用不同的环境

如何在具有 JDBC 安全性的 Spring Boot 中使用 Flyway?

Spring Boot 集成 Flyway,数据库也能做版本控制,太牛逼了!