Files
pgsql-jellyfin/docs/GENERATE_POSTGRESQL_MIGRATIONS.md
wjones a3eb4b1b57 Add automatic PostgreSQL database creation and migration
- Added Jellyfin.Database.Providers.Postgres project with full EF Core migration support for PostgreSQL.
- Implemented automatic database creation and privilege assignment on startup.
- Generated initial migration and model snapshot for PostgreSQL schema.
- Updated build, test, and dependency files to include PostgreSQL provider and Npgsql packages.
- Added PowerShell script for generating and testing PostgreSQL migrations.
- No changes to application logic outside database provider/migration infrastructure.
2026-02-22 18:51:24 -05:00

114 lines
3.8 KiB
Markdown

# Generate PostgreSQL Migrations from SQLite
This script generates PostgreSQL migrations that match the SQLite migration schema.
## Prerequisites
- .NET SDK installed
- `dotnet-ef` tools installed: `dotnet tool install --global dotnet-ef`
- PostgreSQL database running (for testing)
## Step 1: Initial Migration Generation
Since the DbContext model is shared between SQLite and PostgreSQL providers, we can generate PostgreSQL migrations directly from the model:
```powershell
# Navigate to PostgreSQL provider project
cd E:\Projects\pgsql-jellyfin\src\Jellyfin.Database\Jellyfin.Database.Providers.Postgres
# Generate the initial migration (creates all tables matching current DbContext)
dotnet ef migrations add InitialCreate --context JellyfinDbContext --output-dir Migrations
# This will create migration files matching the current schema
```
## Step 2: Verify Generated Migration
The generated migration should include all tables:
- ActivityLogs
- Users, Permissions, Preferences
- Devices, DeviceOptions
- DisplayPreferences, ItemDisplayPreferences, CustomItemDisplayPreferences
- ImageInfos
- TrickplayInfos
- MediaSegments
- BaseItems, AncestorIds, AttachmentStreamInfos
- Chapters, ItemValues, ItemValuesMap
- MediaStreamInfos, UserData
- And more...
## Step 3: Apply Migration (Test)
```powershell
# Test on a PostgreSQL database
dotnet ef database update --context JellyfinDbContext --connection "Host=localhost;Database=jellyfin_test;Username=jellyfin;Password=test"
```
## Alternative: Manual Migration Copying (Not Recommended)
If you need to maintain separate migrations per provider (not typical for EF Core):
1. Copy SQLite migration structure
2. Replace SQLite-specific code with PostgreSQL equivalents:
- `.Annotation("Sqlite:Autoincrement", true)``.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn)`
- `type: "TEXT"``type: "text"` or appropriate PostgreSQL type
- `type: "INTEGER"``type: "integer"` or `type: "bigint"`
- `type: "REAL"``type: "real"` or `type: "double precision"`
## Why Single Migration is Better
EF Core migrations are **provider-agnostic** at the model level. The same migration can target different databases:
- The migration C# code uses `MigrationBuilder` API (database-agnostic)
- EF Core generates database-specific SQL at runtime
- One migration file works for SQLite, PostgreSQL, MySQL, etc.
The difference is in the migration assembly location:
- SQLite migrations: `Jellyfin.Database.Providers.Sqlite` assembly
- PostgreSQL migrations: `Jellyfin.Database.Providers.Postgres` assembly
Each provider has its own migration history.
## Recommended Approach
**Use the InitialCreate migration** generated from the current DbContext model. This will:
- ✅ Match the current schema exactly
- ✅ Be PostgreSQL-optimized
- ✅ Include all tables, indexes, and constraints
- ✅ Work with the migration system
- ✅ Be maintainable going forward
## Post-Generation Steps
After generating the initial migration:
1. **Review the generated code** - ensure all tables are included
2. **Test on clean database** - verify schema creation works
3. **Compare with SQLite schema** - ensure parity
4. **Commit to source control** - save the migration files
5. **Document any PostgreSQL-specific customizations**
## Future Migrations
For new schema changes:
1. Update the `JellyfinDbContext` model
2. Generate migration for BOTH providers:
```powershell
# SQLite
cd src\Jellyfin.Database\Jellyfin.Database.Providers.Sqlite
dotnet ef migrations add YourMigrationName --context JellyfinDbContext
# PostgreSQL
cd ..\Jellyfin.Database.Providers.Postgres
dotnet ef migrations add YourMigrationName --context JellyfinDbContext
```
## Execution
To execute this script:
```powershell
# Run the generation command
.\Generate-PostgreSQLMigrations.ps1
```