You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 3未执行db migrations表创建脚本问题求助

Spring Boot 3集成Flyway后迁移脚本未执行导致表不存在问题

问题描述

使用Spring Boot 3开发,框架默认集成Flyway。执行./gradlew bootRun启动应用无报错,但尝试向数据库保存数据时触发以下错误:

org.postgresql.util.PSQLException: ERROR: relation "destination" does not exist

怀疑db/migrations目录下的表创建脚本未被执行。

目录结构

资源目录下的迁移脚本结构如下:

src/
└── main/
    └── resources/
        └── db/
            └── migrations/
                └── V1__create_destination_table.sql

迁移脚本内容

V1__create_destination_table.sql代码:

CREATE TABLE destination (
    id uuid DEFAULT uuid_generate_v4 (),
    name character varying(255) NOT NULL,
    address character varying(10000) NOT NULL,
    destination_type character varying(255),
    phone_number character varying(255),
    image_link character varying(10000),
    business_link character varying(10000),
    version bigint NOT NULL,
    dateCreated timestamp without time zone,

    CONSTRAINT destination_pkey PRIMARY KEY (id)
);

application.properties配置

server.port=${CDOYPBE_PORT}

management.security.enabled = false
management.endpoints.web.exposure.include=health,info,beans,metrics,trace,trace

spring.jpa.hibernate.ddl-auto=none
spring.jpa.properties.hibernate.jdbc.batch_size=30
spring.jpa.properties.hibernate.order_inserts=true
spring.jpa.properties.hibernate.batch_versioned_data=true

spring.flyway.enabled=true
spring.flyway.driver-class-name=org.postgresql.Driver
spring.flyway.url=${CDOYPBE_DB_URL}
spring.flyway.user=${CDOYPBE_DB_USER_NAME}
spring.flyway.password=${CDOYPBE_DB_PASSWORD}
spring.flyway.locations=classpath:db/migrations
spring.flyway.schemas=migrations

spring.datasource.url=${CDOYPBE_DB_URL}
spring.datasource.username=${CDOYPBE_DB_USER_NAME}
spring.datasource.password=${CDOYPBE_DB_PASSWORD}
spring.datasource.driver-class-name=org.postgresql.Driver

build.gradle配置

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.1.0'
    id 'io.spring.dependency-management' version '1.1.0'
    id 'groovy'
}

group = 'com.zeitgeist'
sourceCompatibility = '17'

repositories {
    mavenCentral()
}

test {
    useJUnitPlatform()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.postgresql:postgresql'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-validation'
    implementation 'org.springframework.boot:spring-boot-starter-actuator:3.1.0'

    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'

    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.spockframework:spock-spring:2.3-groovy-4.0'
}

排查与解决建议

  1. 开启Flyway debug日志
    在application.properties中添加logging.level.org.flywaydb=DEBUG,启动应用后查看日志,确认Flyway是否检测到迁移脚本、是否尝试执行,以及是否有隐藏的执行错误。

  2. 检查schema配置一致性
    配置中spring.flyway.schemas=migrations指定了Flyway在migrations schema下执行脚本,但JPA实体默认会使用数据源的默认schema。需要:

    • 确认数据库中已创建migrations schema
    • 在JPA实体上通过@Table(schema = "migrations")指定schema,或调整Flyway的schema配置为数据源默认schema
  3. 验证迁移脚本是否被打包
    执行./gradlew bootJar生成jar包,解压后查看BOOT-INF/classes/db/migrations/目录下是否存在V1__create_destination_table.sql,若不存在,检查src/main/resources是否为Gradle识别的资源目录。

  4. 检查Flyway执行历史表
    连接数据库,查看migrations schema下的flyway_schema_history表:

    • 若表不存在,说明Flyway未初始化,检查数据库连接权限
    • 若表存在,查看脚本执行记录的状态,确认是否执行失败
  5. 简化Flyway配置
    Spring Boot会自动从数据源继承连接信息,可删除spring.flyway.url、spring.flyway.user、spring.flyway.password配置,避免配置不一致导致的问题。

  6. 确认PostgreSQL UUID扩展
    脚本中使用了uuid_generate_v4(),需在数据库中执行CREATE EXTENSION IF NOT EXISTS "uuid-ossp";创建UUID扩展,否则表创建会失败,导致Flyway脚本执行异常。

内容的提问来源于stack exchange,提问作者CarrotSnip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 09:35:35