Files
pgsql-jellyfin/docs/SCHEMA_COLUMN_CONVERSION_REFERENCE.md
T
wjones e67c191843 Add comprehensive documentation for PostgreSQL schema conversion
- Introduced DATABASE_SCHEMA_MISMATCH_REPORT.md to detail critical mismatches between SQL schema and C# code configurations, highlighting issues with naming conventions and potential runtime failures.
- Created SCHEMA_COLUMN_CONVERSION_REFERENCE.md to provide a reference for column name conversions from PascalCase to snake_case across all tables.
- Developed SCHEMA_CONVERSION_GUIDE.md outlining the conversion strategy for the SQL schema, including authoritative table mappings, column naming rules, and a validation checklist to ensure accuracy in the conversion process.
2026-05-04 10:16:17 -04:00

479 lines
16 KiB
Markdown

# SQL Column Conversion Reference - All Tables
## Activity Log Schema
### activity_logs (activitylog."ActivityLogs")
| Current (SQL) | Target (snake_case) |
|--------------|-------------------|
| `"Id"` | `id` |
| `"Name"` | `name` |
| `"Overview"` | `overview` |
| `"ShortOverview"` | `short_overview` |
| `"Type"` | `type` |
| `"UserId"` | `user_id` |
| `"ItemId"` | `item_id` |
| `"DateCreated"` | `date_created` |
| `"LogSeverity"` | `log_severity` |
| `"RowVersion"` | `row_version` |
---
## Authentication Schema
### api_keys (authentication."ApiKeys")
| Current (SQL) | Target (snake_case) |
|--------------|-------------------|
| `"Id"` | `id` |
| `"DateCreated"` | `date_created` |
| `"DateLastActivity"` | `date_last_activity` |
| `"Name"` | `name` |
| `"AccessToken"` | `access_token` |
### devices (authentication."Devices")
| Current (SQL) | Target (snake_case) |
|--------------|-------------------|
| `"Id"` | `id` |
| `"UserId"` | `user_id` |
| `"AccessToken"` | `access_token` |
| `"AppName"` | `app_name` |
| `"AppVersion"` | `app_version` |
| `"DeviceName"` | `device_name` |
| `"DeviceId"` | `device_id` |
| `"IsActive"` | `is_active` |
| `"DateCreated"` | `date_created` |
| `"DateModified"` | `date_modified` |
| `"DateLastActivity"` | `date_last_activity` |
### device_options (authentication."DeviceOptions")
| Current (SQL) | Target (snake_case) |
|--------------|-------------------|
| `"Id"` | `id` |
| `"DeviceId"` | `device_id` |
| `"CustomName"` | `custom_name` |
---
## Display Preferences Schema
### display_preferences (displaypreferences."DisplayPreferences")
| Current (SQL) | Target (snake_case) |
|--------------|-------------------|
| `"Id"` | `id` |
| `"UserId"` | `user_id` |
| `"ItemId"` | `item_id` |
| `"Client"` | `client` |
| `"ShowSidebar"` | `show_sidebar` |
| `"ShowBackdrop"` | `show_backdrop` |
| `"ScrollDirection"` | `scroll_direction` |
| `"IndexBy"` | `index_by` |
| `"SkipForwardLength"` | `skip_forward_length` |
| `"SkipBackwardLength"` | `skip_backward_length` |
| `"ChromecastVersion"` | `chromecast_version` |
| `"EnableNextVideoInfoOverlay"` | `enable_next_video_info_overlay` |
| `"DashboardTheme"` | `dashboard_theme` |
| `"TvHome"` | `tv_home` |
### item_display_preferences (displaypreferences."ItemDisplayPreferences")
| Current (SQL) | Target (snake_case) |
|--------------|-------------------|
| `"Id"` | `id` |
| `"UserId"` | `user_id` |
| `"ItemId"` | `item_id` |
| `"Client"` | `client` |
| `"ViewType"` | `view_type` |
| `"RememberIndexing"` | `remember_indexing` |
| `"IndexBy"` | `index_by` |
| `"RememberSorting"` | `remember_sorting` |
| `"SortBy"` | `sort_by` |
| `"SortOrder"` | `sort_order` |
### custom_item_display_preferences (displaypreferences."CustomItemDisplayPreferences")
| Current (SQL) | Target (snake_case) |
|--------------|-------------------|
| `"Id"` | `id` |
| `"UserId"` | `user_id` |
| `"ItemId"` | `item_id` |
| `"Client"` | `client` |
| `"Key"` | `key` |
| `"Value"` | `value` |
### home_sections (displaypreferences."HomeSection")
| Current (SQL) | Target (snake_case) |
|--------------|-------------------|
| `"Id"` | `id` |
| `"DisplayPreferencesId"` | `display_preferences_id` |
| `"Order"` | `order` |
| `"Type"` | `type` |
---
## Library Schema
### base_items (library."BaseItems") - 73 columns
| Current (SQL) | Target (snake_case) |
|--------------|-------------------|
| `"Id"` | `id` |
| `"Type"` | `type` |
| `"Data"` | `data` |
| `"Path"` | `path` |
| `"StartDate"` | `start_date` |
| `"EndDate"` | `end_date` |
| `"ChannelId"` | `channel_id` |
| `"IsMovie"` | `is_movie` |
| `"CommunityRating"` | `community_rating` |
| `"CustomRating"` | `custom_rating` |
| `"IndexNumber"` | `index_number` |
| `"IsLocked"` | `is_locked` |
| `"Name"` | `name` |
| `"OfficialRating"` | `official_rating` |
| `"MediaType"` | `media_type` |
| `"Overview"` | `overview` |
| `"ParentIndexNumber"` | `parent_index_number` |
| `"PremiereDate"` | `premiere_date` |
| `"ProductionYear"` | `production_year` |
| `"Genres"` | `genres` |
| `"SortName"` | `sort_name` |
| `"ForcedSortName"` | `forced_sort_name` |
| `"RunTimeTicks"` | `run_time_ticks` |
| `"DateCreated"` | `date_created` |
| `"DateModified"` | `date_modified` |
| `"IsSeries"` | `is_series` |
| `"EpisodeTitle"` | `episode_title` |
| `"IsRepeat"` | `is_repeat` |
| `"PreferredMetadataLanguage"` | `preferred_metadata_language` |
| `"PreferredMetadataCountryCode"` | `preferred_metadata_country_code` |
| `"DateLastRefreshed"` | `date_last_refreshed` |
| `"DateLastSaved"` | `date_last_saved` |
| `"IsInMixedFolder"` | `is_in_mixed_folder` |
| `"Studios"` | `studios` |
| `"ExternalServiceId"` | `external_service_id` |
| `"Tags"` | `tags` |
| `"IsFolder"` | `is_folder` |
| `"InheritedParentalRatingValue"` | `inherited_parental_rating_value` |
| `"InheritedParentalRatingSubValue"` | `inherited_parental_rating_sub_value` |
| `"UnratedType"` | `unrated_type` |
| `"CriticRating"` | `critic_rating` |
| `"CleanName"` | `clean_name` |
| `"PresentationUniqueKey"` | `presentation_unique_key` |
| `"OriginalTitle"` | `original_title` |
| `"PrimaryVersionId"` | `primary_version_id` |
| `"DateLastMediaAdded"` | `date_last_media_added` |
| `"Album"` | `album` |
| `"LUFS"` | `lufs` |
| `"NormalizationGain"` | `normalization_gain` |
| `"IsVirtualItem"` | `is_virtual_item` |
| `"SeriesName"` | `series_name` |
| `"SeasonName"` | `season_name` |
| `"ExternalSeriesId"` | `external_series_id` |
| `"Tagline"` | `tagline` |
| `"ProductionLocations"` | `production_locations` |
| `"ExtraIds"` | `extra_ids` |
| `"TotalBitrate"` | `total_bitrate` |
| `"ExtraType"` | `extra_type` |
| `"Artists"` | `artists` |
| `"AlbumArtists"` | `album_artists` |
| `"ExternalId"` | `external_id` |
| `"SeriesPresentationUniqueKey"` | `series_presentation_unique_key` |
| `"ShowId"` | `show_id` |
| `"OwnerId"` | `owner_id` |
| `"Width"` | `width` |
| `"Height"` | `height` |
| `"Size"` | `size` |
| `"Audio"` | `audio` |
| `"ParentId"` | `parent_id` |
| `"TopParentId"` | `top_parent_id` |
| `"SeasonId"` | `season_id` |
| `"SeriesId"` | `series_id` |
### chapters (library."Chapters")
| Current (SQL) | Target (snake_case) |
|--------------|-------------------|
| `"ItemId"` | `item_id` |
| `"ChapterIndex"` | `chapter_index` |
| `"StartPositionTicks"` | `start_position_ticks` |
| `"Name"` | `name` |
| `"ImagePath"` | `image_path` |
| `"ImageDateModified"` | `image_date_modified` |
### media_stream_infos (library."MediaStreamInfos") - 51 columns
| Current (SQL) | Target (snake_case) |
|--------------|-------------------|
| `"ItemId"` | `item_id` |
| `"StreamIndex"` | `stream_index` |
| `"StreamType"` | `stream_type` |
| `"Codec"` | `codec` |
| `"Language"` | `language` |
| `"ChannelLayout"` | `channel_layout` |
| `"Profile"` | `profile` |
| `"AspectRatio"` | `aspect_ratio` |
| `"Path"` | `path` |
| `"IsInterlaced"` | `is_interlaced` |
| `"BitRate"` | `bit_rate` |
| `"Channels"` | `channels` |
| `"SampleRate"` | `sample_rate` |
| `"IsDefault"` | `is_default` |
| `"IsForced"` | `is_forced` |
| `"IsExternal"` | `is_external` |
| `"Height"` | `height` |
| `"Width"` | `width` |
| `"AverageFrameRate"` | `average_frame_rate` |
| `"RealFrameRate"` | `real_frame_rate` |
| `"Level"` | `level` |
| `"PixelFormat"` | `pixel_format` |
| `"BitDepth"` | `bit_depth` |
| `"IsAnamorphic"` | `is_anamorphic` |
| `"RefFrames"` | `ref_frames` |
| `"CodecTag"` | `codec_tag` |
| `"Comment"` | `comment` |
| `"NalLengthSize"` | `nal_length_size` |
| `"IsAvc"` | `is_avc` |
| `"Title"` | `title` |
| `"TimeBase"` | `time_base` |
| `"CodecTimeBase"` | `codec_time_base` |
| `"ColorPrimaries"` | `color_primaries` |
| `"ColorSpace"` | `color_space` |
| `"ColorTransfer"` | `color_transfer` |
| `"DvVersionMajor"` | `dv_version_major` |
| `"DvVersionMinor"` | `dv_version_minor` |
| `"DvProfile"` | `dv_profile` |
| `"DvLevel"` | `dv_level` |
| `"RpuPresentFlag"` | `rpu_present_flag` |
| `"ElPresentFlag"` | `el_present_flag` |
| `"BlPresentFlag"` | `bl_present_flag` |
| `"DvBlSignalCompatibilityId"` | `dv_bl_signal_compatibility_id` |
| `"IsHearingImpaired"` | `is_hearing_impaired` |
| `"Rotation"` | `rotation` |
| `"KeyFrames"` | `key_frames` |
| `"Hdr10PlusPresentFlag"` | `hdr10_plus_present_flag` |
### attachment_stream_infos (library."AttachmentStreamInfos")
| Current (SQL) | Target (snake_case) |
|--------------|-------------------|
| `"ItemId"` | `item_id` |
| `"Index"` | `index` |
| `"Codec"` | `codec` |
| `"CodecTag"` | `codec_tag` |
| `"Comment"` | `comment` |
| `"Filename"` | `filename` |
| `"MimeType"` | `mime_type` |
### image_infos (library."ImageInfos")
| Current (SQL) | Target (snake_case) |
|--------------|-------------------|
| `"Id"` | `id` |
| `"UserId"` | `user_id` |
| `"Path"` | `path` |
| `"LastModified"` | `last_modified` |
### base_item_image_infos (library."BaseItemImageInfos")
| Current (SQL) | Target (snake_case) |
|--------------|-------------------|
| `"Id"` | `id` |
| `"Path"` | `path` |
| `"DateModified"` | `date_modified` |
| `"ImageType"` | `image_type` |
| `"Width"` | `width` |
| `"Height"` | `height` |
| `"Blurhash"` | `blurhash` |
| `"ItemId"` | `item_id` |
### base_item_metadata_fields (library."BaseItemMetadataFields")
| Current (SQL) | Target (snake_case) |
|--------------|-------------------|
| `"Id"` | `id` |
| `"ItemId"` | `item_id` |
### base_item_providers (library."BaseItemProviders")
| Current (SQL) | Target (snake_case) |
|--------------|-------------------|
| `"ItemId"` | `item_id` |
| `"ProviderId"` | `provider_id` |
| `"ProviderValue"` | `provider_value` |
### base_item_trailer_types (library."BaseItemTrailerTypes")
| Current (SQL) | Target (snake_case) |
|--------------|-------------------|
| `"Id"` | `id` |
| `"ItemId"` | `item_id` |
### item_values (library."ItemValues")
| Current (SQL) | Target (snake_case) |
|--------------|-------------------|
| `"ItemValueId"` | `item_value_id` |
| `"Type"` | `type` |
| `"Value"` | `value` |
| `"CleanValue"` | `clean_value` |
### item_values_map (library."ItemValuesMap")
| Current (SQL) | Target (snake_case) |
|--------------|-------------------|
| `"ItemId"` | `item_id` |
| `"ItemValueId"` | `item_value_id` |
### peoples (library."Peoples")
| Current (SQL) | Target (snake_case) |
|--------------|-------------------|
| `"Id"` | `id` |
| `"Name"` | `name` |
| `"PersonType"` | `person_type` |
### people_base_item_map (library."PeopleBaseItemMap")
| Current (SQL) | Target (snake_case) |
|--------------|-------------------|
| `"Role"` | `role` |
| `"ItemId"` | `item_id` |
| `"PeopleId"` | `people_id` |
| `"SortOrder"` | `sort_order` |
| `"ListOrder"` | `list_order` |
### user_data (library."UserData")
| Current (SQL) | Target (snake_case) |
|--------------|-------------------|
| `"CustomDataKey"` | `custom_data_key` |
| `"ItemId"` | `item_id` |
| `"UserId"` | `user_id` |
| `"Rating"` | `rating` |
| `"PlaybackPositionTicks"` | `playback_position_ticks` |
| `"PlayCount"` | `play_count` |
| `"IsFavorite"` | `is_favorite` |
| `"LastPlayedDate"` | `last_played_date` |
| `"Played"` | `played` |
| `"AudioStreamIndex"` | `audio_stream_index` |
| `"SubtitleStreamIndex"` | `subtitle_stream_index` |
| `"Likes"` | `likes` |
| `"RetentionDate"` | `retention_date` |
### ancestor_ids (library."AncestorIds")
| Current (SQL) | Target (snake_case) |
|--------------|-------------------|
| `"ParentItemId"` | `parent_item_id` |
| `"ItemId"` | `item_id` |
### trickplay_infos (library."TrickplayInfos")
| Current (SQL) | Target (snake_case) |
|--------------|-------------------|
| `"ItemId"` | `item_id` |
| `"Width"` | `width` |
| `"Height"` | `height` |
| `"TileWidth"` | `tile_width` |
| `"TileHeight"` | `tile_height` |
| `"ThumbnailCount"` | `thumbnail_count` |
| `"Interval"` | `interval` |
| `"Bandwidth"` | `bandwidth` |
### media_segments (library."MediaSegments")
| Current (SQL) | Target (snake_case) |
|--------------|-------------------|
| `"Id"` | `id` |
| `"ItemId"` | `item_id` |
| `"Type"` | `type` |
| `"EndTicks"` | `end_ticks` |
| `"StartTicks"` | `start_ticks` |
| `"SegmentProviderId"` | `segment_provider_id` |
### keyframe_data (library."KeyframeData")
| Current (SQL) | Target (snake_case) |
|--------------|-------------------|
| `"ItemId"` | `item_id` |
| `"TotalDuration"` | `total_duration` |
| `"KeyframeTicks"` | `keyframe_ticks` |
### library_options (library."LibraryOptions") - Note: Not yet found in schema, may need verification
Expected columns (from LibraryOptionsEntity EF mapping):
- LibraryPath (primary key, text/string)
- DateModified (timestamp with time zone)
---
## Users Schema
### users (users."Users") - 36+ columns
| Current (SQL) | Target (snake_case) |
|--------------|-------------------|
| `"Id"` | `id` |
| `"Username"` | `username` |
| `"Password"` | `password` |
| `"MustUpdatePassword"` | `must_update_password` |
| `"AudioLanguagePreference"` | `audio_language_preference` |
| `"AuthenticationProviderId"` | `authentication_provider_id` |
| `"PasswordResetProviderId"` | `password_reset_provider_id` |
| `"InvalidLoginAttemptCount"` | `invalid_login_attempt_count` |
| `"LastActivityDate"` | `last_activity_date` |
| `"LastLoginDate"` | `last_login_date` |
| `"LoginAttemptsBeforeLockout"` | `login_attempts_before_lockout` |
| `"MaxActiveSessions"` | `max_active_sessions` |
| `"SubtitleMode"` | `subtitle_mode` |
| `"PlayDefaultAudioTrack"` | `play_default_audio_track` |
| `"SubtitleLanguagePreference"` | `subtitle_language_preference` |
| `"DisplayMissingEpisodes"` | `display_missing_episodes` |
| `"DisplayCollectionsView"` | `display_collections_view` |
| `"EnableLocalPassword"` | `enable_local_password` |
| `"HidePlayedInLatest"` | `hide_played_in_latest` |
| `"RememberAudioSelections"` | `remember_audio_selections` |
| `"RememberSubtitleSelections"` | `remember_subtitle_selections` |
| `"EnableNextEpisodeAutoPlay"` | `enable_next_episode_auto_play` |
| `"EnableAutoLogin"` | `enable_auto_login` |
| `"EnableUserPreferenceAccess"` | `enable_user_preference_access` |
| `"MaxParentalRatingScore"` | `max_parental_rating_score` |
| `"MaxParentalRatingSubScore"` | `max_parental_rating_sub_score` |
| `"RemoteClientBitrateLimit"` | `remote_client_bitrate_limit` |
| `"InternalId"` | `internal_id` |
| `"SyncPlayAccess"` | `sync_play_access` |
| `"CastReceiverId"` | `cast_receiver_id` |
| `"RowVersion"` | `row_version` |
### permissions (users."Permissions")
| Current (SQL) | Target (snake_case) |
|--------------|-------------------|
| `"Id"` | `id` |
| `"UserId"` | `user_id` |
| `"Kind"` | `kind` |
| `"Value"` | `value` |
| `"RowVersion"` | `row_version` |
| `"Permission_Permissions_Guid"` | `permission_permissions_guid` |
### preferences (users."Preferences")
| Current (SQL) | Target (snake_case) |
|--------------|-------------------|
| `"Id"` | `id` |
| `"UserId"` | `user_id` |
| `"Kind"` | `kind` |
| `"Value"` | `value` |
| `"RowVersion"` | `row_version` |
| `"Preference_Preferences_Guid"` | `preference_preferences_guid` |
### access_schedules (users."AccessSchedules")
| Current (SQL) | Target (snake_case) |
|--------------|-------------------|
| `"Id"` | `id` |
| `"UserId"` | `user_id` |
| `"DayOfWeek"` | `day_of_week` |
| `"StartHour"` | `start_hour` |
| `"EndHour"` | `end_hour` |
---
## Special System Tables
### __ef_migrations_history (public."__EFMigrationsHistory")
| Current (SQL) | Target (snake_case) |
|--------------|-------------------|
| `"MigrationId"` | `migration_id` |
| `"ProductVersion"` | `product_version` |
---
## Summary Statistics
- **Total Application Tables**: 19
- **Total Library Schema Tables**: 19 (with BaseItems being the largest at 73 columns)
- **Total Media Stream Columns**: 51 (MediaStreamInfos is the second-largest table)
- **Total Columns Across All Tables**: ~250+
- **Sequences to Rename**: 17 (one per auto-increment table)
- **Special System Table**: 1 (`__EFMigrationsHistory`)
---
Generated: 2025-05-01
For use in create_database_schema.sql conversion from quoted PascalCase to lowercase/snake_case identifiers