a3eb4b1b57
- 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.
114 lines
3.8 KiB
Markdown
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
|
|
```
|