Spring Boot 3未执行db migrations表创建脚本问题求助
问题描述
使用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' }
排查与解决建议
开启Flyway debug日志
在application.properties中添加logging.level.org.flywaydb=DEBUG,启动应用后查看日志,确认Flyway是否检测到迁移脚本、是否尝试执行,以及是否有隐藏的执行错误。检查schema配置一致性
配置中spring.flyway.schemas=migrations指定了Flyway在migrationsschema下执行脚本,但JPA实体默认会使用数据源的默认schema。需要:- 确认数据库中已创建
migrationsschema - 在JPA实体上通过
@Table(schema = "migrations")指定schema,或调整Flyway的schema配置为数据源默认schema
- 确认数据库中已创建
验证迁移脚本是否被打包
执行./gradlew bootJar生成jar包,解压后查看BOOT-INF/classes/db/migrations/目录下是否存在V1__create_destination_table.sql,若不存在,检查src/main/resources是否为Gradle识别的资源目录。检查Flyway执行历史表
连接数据库,查看migrationsschema下的flyway_schema_history表:- 若表不存在,说明Flyway未初始化,检查数据库连接权限
- 若表存在,查看脚本执行记录的状态,确认是否执行失败
简化Flyway配置
Spring Boot会自动从数据源继承连接信息,可删除spring.flyway.url、spring.flyway.user、spring.flyway.password配置,避免配置不一致导致的问题。确认PostgreSQL UUID扩展
脚本中使用了uuid_generate_v4(),需在数据库中执行CREATE EXTENSION IF NOT EXISTS "uuid-ossp";创建UUID扩展,否则表创建会失败,导致Flyway脚本执行异常。
内容的提问来源于stack exchange,提问作者CarrotSnip

