Files
pgsql-jellyfin/tools/Generate-PostgreSQLMigrations.ps1
T
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

122 lines
4.8 KiB
PowerShell

# Generate PostgreSQL Migrations Script
# This script creates PostgreSQL EF Core migrations from the Jellyfin DbContext
[CmdletBinding()]
param(
[string]$ConnectionString = "Host=localhost;Database=jellyfin_test;Username=jellyfin;Password=jellyfin",
[switch]$TestMigration
)
$ErrorActionPreference = "Stop"
# Get paths
$WorkspaceRoot = "E:\Projects\pgsql-jellyfin"
$PostgresProviderPath = Join-Path $WorkspaceRoot "src\Jellyfin.Database\Jellyfin.Database.Providers.Postgres"
$MigrationsPath = Join-Path $PostgresProviderPath "Migrations"
Write-Host "Checking prerequisites..." -ForegroundColor Cyan
# Check if dotnet-ef is installed
try {
$efVersion = dotnet ef --version 2>&1
Write-Host "dotnet-ef installed: $efVersion" -ForegroundColor Green
} catch {
Write-Host "dotnet-ef not found. Installing..." -ForegroundColor Red
dotnet tool install --global dotnet-ef
if ($LASTEXITCODE -ne 0) {
throw "Failed to install dotnet-ef"
}
}
# Check if PostgreSQL provider project exists
if (-not (Test-Path $PostgresProviderPath)) {
throw "PostgreSQL provider project not found at: $PostgresProviderPath"
}
Write-Host "PostgreSQL provider path: $PostgresProviderPath" -ForegroundColor Cyan
# Navigate to PostgreSQL provider directory
Push-Location $PostgresProviderPath
try {
Write-Host "`nBuilding project..." -ForegroundColor Cyan
dotnet build --configuration Release
if ($LASTEXITCODE -ne 0) {
throw "Build failed"
}
Write-Host "`nChecking existing migrations..." -ForegroundColor Cyan
$existingMigrations = Get-ChildItem -Path $MigrationsPath -Filter "*.cs" -ErrorAction SilentlyContinue |
Where-Object { $_.Name -notlike "*Designer.cs" -and $_.Name -notlike "*Factory.cs" }
if ($existingMigrations) {
Write-Host "Found $($existingMigrations.Count) existing migration(s):" -ForegroundColor Yellow
$existingMigrations | ForEach-Object { Write-Host " - $($_.Name)" -ForegroundColor Yellow }
$response = Read-Host "`nRemove existing migrations and create fresh InitialCreate? (y/N)"
if ($response -eq 'y' -or $response -eq 'Y') {
Write-Host "Removing existing migrations..." -ForegroundColor Yellow
$existingMigrations | Remove-Item -Force
$designerFiles = Get-ChildItem -Path $MigrationsPath -Filter "*Designer.cs" -ErrorAction SilentlyContinue
$designerFiles | Remove-Item -Force
Write-Host "Existing migrations removed" -ForegroundColor Green
} else {
Write-Host "Cancelled by user" -ForegroundColor Red
return
}
}
Write-Host "`nGenerating InitialCreate migration for PostgreSQL..." -ForegroundColor Cyan
Write-Host " This may take a minute..." -ForegroundColor Gray
dotnet ef migrations add InitialCreate --context JellyfinDbContext --output-dir Migrations --verbose
if ($LASTEXITCODE -ne 0) {
throw "Migration generation failed"
}
Write-Host "PostgreSQL migration generated successfully!" -ForegroundColor Green
# List generated files
$generatedFiles = Get-ChildItem -Path $MigrationsPath -Filter "*InitialCreate*"
Write-Host "`nGenerated files:" -ForegroundColor Cyan
$generatedFiles | ForEach-Object {
Write-Host " - $($_.Name)" -ForegroundColor Green
}
# Test migration if requested
if ($TestMigration) {
Write-Host "`nTesting migration application..." -ForegroundColor Cyan
Write-Host " Connection: $ConnectionString" -ForegroundColor Gray
$confirmTest = Read-Host "This will modify the test database. Continue? (y/N)"
if ($confirmTest -eq 'y' -or $confirmTest -eq 'Y') {
dotnet ef database update --context JellyfinDbContext --connection "$ConnectionString" --verbose
if ($LASTEXITCODE -eq 0) {
Write-Host "Migration applied successfully to test database!" -ForegroundColor Green
} else {
Write-Host "Migration application failed. Check the error above." -ForegroundColor Yellow
}
} else {
Write-Host "Test migration skipped" -ForegroundColor Cyan
}
}
Write-Host "`nMigration generation complete!" -ForegroundColor Green
Write-Host "`nNext steps:" -ForegroundColor Cyan
Write-Host " 1. Review the generated migration files" -ForegroundColor White
Write-Host " 2. Build the project to ensure no compilation errors" -ForegroundColor White
Write-Host " 3. Test with a PostgreSQL database" -ForegroundColor White
Write-Host " 4. Commit the migration files to source control" -ForegroundColor White
} catch {
Write-Host "`nError: $_" -ForegroundColor Red
Write-Host $_.ScriptStackTrace -ForegroundColor Red
exit 1
} finally {
Pop-Location
}
Write-Host "`nDone!" -ForegroundColor Green