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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.02 00:23:09