Files
pgsql-jellyfin/docs/FEATURE_DATABASE_TABLE_VERIFICATION.md
T
wjones 8f860a8ec3 Centralize build output and generate OS-specific startup.json
- All DLLs now output to lib\[Configuration]\[TargetFramework]\ at repo root (see Directory.Build.props)
- .gitignore updated to exclude /lib/
- On first run, startup.json is auto-generated with OS-appropriate default paths (Windows, Linux, macOS, or portable)
- Removes null/example config; generated config is immediately usable and clearly documented
- Extensive new documentation: build output, startup.json logic, visual guides, and code proofs
- Publish profile now deletes existing files for clean deploys
- No breaking changes: existing startup.json files are preserved
- Improves first-run UX, deployment, and cross-platform consistency
2026-02-26 14:21:26 -05:00

91 lines
4.0 KiB
Markdown

# Database Table Verification and Auto-Creation Feature
## Overview
Added automatic database table verification and creation during Jellyfin startup. This ensures all required tables exist and automatically applies any pending Entity Framework Core migrations.
## Changes Made
### 1. Interface Update
**File**: `src/Jellyfin.Database/Jellyfin.Database.Implementations/IJellyfinDatabaseProvider.cs`
- Added `EnsureTablesExistAsync` method to the `IJellyfinDatabaseProvider` interface
- This method is responsible for checking and creating missing database tables
### 2. PostgreSQL Provider Implementation
**File**: `src/Jellyfin.Database/Jellyfin.Database.Providers.Postgres/PostgresDatabaseProvider.cs`
- Implemented `EnsureTablesExistAsync` method
- Checks for pending EF Core migrations
- Applies migrations if needed using `Database.MigrateAsync()`
- Verifies each schema (activitylog, authentication, displaypreferences, library, users) contains tables
- Logs warnings if schemas exist but contain no tables
- Provides detailed logging throughout the process
### 3. SQLite Provider Implementation
**File**: `src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/SqliteDatabaseProvider.cs`
- Implemented `EnsureTablesExistAsync` method for SQLite
- Checks for pending migrations
- Applies migrations if needed
- Verifies database integrity
- Logs table count and completion status
### 4. Startup Integration
**File**: `Jellyfin.Server/Program.cs`
- Added call to `EnsureTablesExistAsync` in the `StartServer` method
- Executes after `PrepareDatabaseProvider` but before backup restoration
- Runs early in the startup process to ensure database is ready
## How It Works
1. **During Startup**: After the database provider is prepared, the system calls `EnsureTablesExistAsync()`
2. **Migration Check**: The method checks if there are any pending EF Core migrations
3. **Migration Application**: If migrations are pending, they are automatically applied
4. **Table Verification**: The method verifies that all expected schemas contain tables
5. **Logging**: Detailed logs are provided for each step:
- Number of pending migrations found
- Migration application progress
- Schema verification results
- Warnings for empty schemas
## Benefits
- **Automatic Recovery**: Automatically fixes missing tables by applying migrations
- **Early Detection**: Catches database schema issues during startup before they cause runtime errors
- **Detailed Logging**: Provides clear visibility into what's happening with the database
- **Prevention**: Prevents errors like "relation does not exist" by ensuring all tables are created
- **Both Databases**: Works for both PostgreSQL and SQLite providers
## Example Logs
When the system starts and finds missing tables:
```
[INF] Checking PostgreSQL database for missing tables...
[INF] Found 3 pending migrations. Applying migrations...
[INF] Successfully applied 3 migrations
[DBG] Schema 'activitylog' contains 1 tables
[DBG] Schema 'authentication' contains 3 tables
[DBG] Schema 'displaypreferences' contains 4 tables
[DBG] Schema 'library' contains 15 tables
[DBG] Schema 'users' contains 4 tables
[INF] Database table verification complete
```
When everything is up to date:
```
[INF] Checking PostgreSQL database for missing tables...
[INF] All database tables are up to date. No migrations needed.
[INF] Database table verification complete
```
## Testing Recommendations
1. **Fresh Database**: Test with a completely new database to verify migrations are applied
2. **Partial Database**: Test with a database missing some tables to ensure they're created
3. **Complete Database**: Test with an up-to-date database to ensure it skips unnecessary work
4. **Schema Verification**: Verify that the warning logs appear if schemas exist but are empty
## Notes
- The method is called automatically during startup - no configuration needed
- Migrations are applied in the correct order as defined by EF Core
- The process will throw exceptions if migrations fail, preventing startup with a broken database
- Both PostgreSQL and SQLite providers are fully supported