# Flyway Setup Guide for PostgreSQL + Tomcat Deployment
## Goal
This setup allows automatic database updates during deployment.
Each database modification is added as a new SQL migration file. During CI/CD deployment, Flyway executes only the missing migrations safely and in order.
This avoids:
- giant SQL files
- duplicate executions
- manual tracking of DB changes
- production inconsistencies
---
# Environment
This guide is adapted for:
- PostgreSQL 17
- Java 17
- Maven Wrapper (`mvnw.cmd`)
- Tomcat deployment
- Existing production databases
- Windows CI/CD runner
---
# 1. Add Flyway to Maven
## Add Flyway Maven Plugin
In `pom.xml`:
```xml
org.flywaydb
flyway-maven-plugin
11.0.0
```
---
## 2. Create Migration Folder
Create this folder inside the project:
```text
src/main/resources/db/migration
```
---
# 3. Migration Naming Convention while for each Db modification a new file is added
Flyway requires this exact format:
```text
V__.sql
```
Examples:
```text
V1__initial_schema.sql
V2__task301_add_tables_t1_t2.sql
V3__add_client_phone.sql
V4__fix_invoice_indexes.sql
```
Important:
- Use TWO underscores (`__`) after the version
- Never rename old migrations after execution
- Never modify old executed migrations
---
# 4. Existing Database Initialization (One-Time Only)
Since the database already exists in production, Flyway must first create its history table.
## First Migration
Create:
```text
V1__initial_schema.sql
```
This file represents the current database structure.
---
## Baseline Existing Database
Run once only:
```cmd
mvn flyway:baseline ^
-Dflyway.url=jdbc:postgresql://localhost:5432/TrizTresorie ^
-Dflyway.user=postgres ^
-Dflyway.password=YOUR_PASSWORD ^
-Dflyway.baselineVersion=1
```
This creates:
```text
flyway_schema_history
```
and marks version `1` as already applied WITHOUT executing the SQL.
---
# 5. Adding New Database Changes
Every new database modification must be added as a new migration file.
Example:
```text
V2__task301_add_tables_t1_t2.sql
```
Example content:
```sql
CREATE TABLE table1 (
id BIGSERIAL PRIMARY KEY
);
CREATE TABLE table2 (
id BIGSERIAL PRIMARY KEY
);
```
Commit the migration file with the application code.
---
# 6. Running Migrations
To execute pending migrations:
```cmd
mvn flyway:migrate ^
-Dflyway.url=jdbc:postgresql://localhost:5432/TrizTresorie ^
-Dflyway.user=postgres ^
-Dflyway.password=YOUR_PASSWORD
```
Flyway will:
1. Check `flyway_schema_history`
2. Detect already executed migrations
3. Execute only new migrations
4. Save execution history automatically
---
# 7. CI/CD Integration
Add this step before starting Tomcat.
## Example
```yaml
# --------------------------------------------------
# Run database migrations
# --------------------------------------------------
- name: Run database migrations
shell: cmd
run: |
cd %WORKSPACE_DIR%
mvnw.cmd flyway:migrate ^
-Dflyway.url=%DB_URL% ^
-Dflyway.user=%DB_USER% ^
-Dflyway.password=%DB_PASSWORD%
```
Recommended:
- Store DB credentials in CI/CD secrets or environment variables
- Do not hardcode passwords inside the repository
---
# 8. Recommended Developer Workflow
When a developer needs a database change:
## DO
Create a new migration:
```text
V5__add_product_status.sql
```
Commit and push.
---
## DO NOT
Do NOT modify:
```text
V1__initial_schema.sql
```
or any already executed migration.
Always create a new migration instead.
---
# 9. Important Notes
## Migration Order
Flyway executes migrations in version order:
```text
V1
V2
V3
V4
```
---
## Failed Migrations
If a migration fails:
- deployment stops
- Tomcat should not start
- database remains protected from partial execution
Fix the migration and rerun deployment.
---
## Production Safety
Do not:
- delete `flyway_schema_history`
- modify old executed migrations
- manually rerun executed SQL files
---
# 10. Example Project Structure
```text
project/
│
├── src/
│ └── main/
│ └── resources/
│ └── db/
│ └── migration/
│ ├── V1__initial_schema.sql
│ ├── V2__task301_add_tables_t1_t2.sql
│ ├── V3__add_client_phone.sql
│ └── V4__fix_indexes.sql
│
├── pom.xml
└── mvnw.cmd
```
---
# 11. Final Deployment Flow
Recommended deployment sequence:
1. Clone source
2. Build application
3. Stop Tomcat
4. Backup configuration
5. Deploy new application
6. Restore configuration
7. Run Flyway migrations
8. Start Tomcat
9. Cleanup workspace
---
# Result
With this setup:
- database updates become automatic
- all environments stay synchronized
- production deployments become safer
- developers only add new migration files
- no manual SQL tracking is needed