如何在Spring Boot+IntelliJ中用Flyway管控H2与Docker版PostgreSQL
Flyway 管理 Docker PostgreSQL 与 H2 测试库方案
一、项目结构(适配Maven/Gradle)
直接用这个结构,清晰区分主环境和测试环境的配置与迁移脚本:
your-project/ ├── src/ │ ├── main/ │ │ ├── java/ │ │ ├── resources/ │ │ │ ├── db/ │ │ │ │ └── migration/ # 生产/开发通用迁移脚本 │ │ │ │ ├── V1__init_core_schema.sql │ │ │ │ └── V2__add_user_profile_table.sql │ │ │ └── application.properties # PostgreSQL 主配置 │ └── test/ │ ├── java/ │ └── resources/ │ ├── application-test.properties # H2 测试配置 │ └── db/ │ └── migration/ # 测试专属脚本(比如插入测试数据) │ └── V1__seed_test_users.sql ├── docker-compose.yml # PostgreSQL Docker 启动配置 ├── .gitignore └── pom.xml / build.gradle
主迁移脚本放在main/resources/db/migration,测试环境会自动加载这些脚本,再叠加test/resources/db/migration里的测试专属脚本。
二、多环境配置(Spring Boot为例)
1. PostgreSQL(Docker运行)配置
application.properties:
# 数据源连接(对应Docker里的数据库配置) spring.datasource.url=jdbc:postgresql://localhost:5432/portfolio_db spring.datasource.username=postgres spring.datasource.password=portfolio_pass spring.datasource.driver-class-name=org.postgresql.Driver # Flyway 核心配置 spring.flyway.enabled=true spring.flyway.locations=classpath:db/migration spring.flyway.baseline-on-migrate=true # 首次运行自动创建基线,避免历史脚本重复执行
docker-compose.yml(一键启动PostgreSQL):
version: '3.8' services: postgres: image: postgres:15-alpine container_name: portfolio-postgres environment: POSTGRES_DB: portfolio_db POSTGRES_USER: postgres POSTGRES_PASSWORD: portfolio_pass ports: - "5432:5432" volumes: - postgres-data:/var/lib/postgresql/data # 持久化数据库数据,重启容器不丢失 volumes: postgres-data:
启动命令:docker-compose up -d
2. H2测试环境配置
application-test.properties:
# H2 内存库连接配置 spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE spring.datasource.username=sa spring.datasource.password= spring.datasource.driver-class-name=org.h2.Driver # Flyway 测试环境配置 spring.flyway.enabled=true spring.flyway.locations=classpath:db/migration,classpath:test/db/migration spring.flyway.baseline-on-migrate=true spring.flyway.clean-disabled=false # 测试环境允许清理数据库,方便重复跑测试 # 可选:启用H2控制台,测试时可以查看数据 spring.h2.console.enabled=true
测试类上加上@ActiveProfiles("test"),就能自动切换到H2环境并执行Flyway脚本。
三、Flyway脚本兼容双数据库技巧
尽量写通用SQL,避免数据库专属语法,如果必须区分,用Flyway的数据库类型注释:
-- 通用表结构 CREATE TABLE users ( id BIGINT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ); -- PostgreSQL专属配置 /* flyway:dbtype=postgresql */ ALTER TABLE users ALTER COLUMN id SET DEFAULT nextval('users_id_seq'); -- H2专属配置 /* flyway:dbtype=h2 */ ALTER TABLE users ALTER COLUMN id RESTART WITH 1;
四、.gitignore配置
把这些内容放进.gitignore,避免提交敏感信息和冗余文件:
# IDE 文件 .idea/ *.iml .vscode/ *.swp # 构建产物 target/ build/ # 日志 logs/ *.log # 敏感配置(本地自定义配置不要提交) *.env application-local.properties # Docker 临时配置 docker-compose.override.yml
内容的提问来源于stack exchange,提问作者Luiz Gustavo
相关产品推荐
相关产品推荐

