fix(legacy): migrations from airtime 2.5.1 (#3123)
### Description This fixes various problems in legacy migrations that were preventing a successful database migration from Airtime 2.5.1. Previously, following [the procedure](https://libretime.org/docs/admin-manual/install/migrate-from-airtime/) using the migrations provided in the Libretime 4.2.0 installer, without the fixes in this PR, would either fail completely, or cause all of the imported data to be completely deleted. _migrations.py If schema_version is not found in the table cc_prefs, it then checks for system_version to have a value of '2.5.1' (in case this is an airtime 2.5.1 migration which will not have any schema_version in cc_pref). If found, it prevents loading of the schema file, which is critical to preserving the imported Airtime data. 0006_2_5_5 Removed a redundant addition of the image_path and description columns to cc_show (done in earlier migration 003_2_5_2) 0015_2_5_17 Fixed a syntax error with adding the artwork column to cc_files 0023_3_0_0_alpha_9_1 Removed a redundant addition of the artwork column to cc_files (done in earlier migration 0015_2_5_7) ### Documentation Changes The [airtime migration documentation](https://libretime.org/docs/admin-manual/install/migrate-from-airtime/) already suggests a procedure to be followed, it just didn't work because of problems within these migrations. The procedure as documented should now work for those coming from Airtime 2.5.1. ### Testing Notes **What I did:** I attempted to migrate an actual airtime 2.5.1 database from a production system containing a large amount of shows, tracks, and users. I observed that the migration completed without errors, and that the expected system state was achieved within Libretime. Specifically, the calendar, library, authentication, and other aspects are populated with the data that was present in the migrated Airtime database, and Libretime is able to function using this data. **How you can replicate my testing:** Install Libretime 4.2.0. Restore a sample postrgresql database backup from an Airtime 2.5.1 server. Apply the database migration. Restart the services. Login and view the library, calender, etc. ### **Links** Closes: #3121 May also be related to, or even close (as a duplicate): #2563
This commit is contained in:
parent
cf172d5c7c
commit
82d5af2dfb
|
@ -8,8 +8,6 @@ UP = """
|
|||
-- DELETE FROM cc_pref WHERE keystr = 'system_version';
|
||||
-- INSERT INTO cc_pref (keystr, valstr) VALUES ('system_version', '2.5.5');
|
||||
|
||||
ALTER TABLE cc_show ADD COLUMN image_path varchar(255) DEFAULT '';
|
||||
ALTER TABLE cc_show_instances ADD COLUMN description varchar(255) DEFAULT '';
|
||||
"""
|
||||
|
||||
DOWN = None
|
||||
|
|
|
@ -5,7 +5,7 @@ from django.db import migrations
|
|||
from ._migrations import legacy_migration_factory
|
||||
|
||||
UP = """
|
||||
ALTER TABLE cc_files ADD COLUMN artwork TYPE character varying(255);
|
||||
ALTER TABLE cc_files ADD COLUMN artwork VARCHAR(255);
|
||||
"""
|
||||
|
||||
DOWN = None
|
||||
|
|
|
@ -4,12 +4,18 @@ from django.db import migrations
|
|||
|
||||
from ._migrations import legacy_migration_factory
|
||||
|
||||
# This migration is currently a placeholder for 3.0.0-alpha.9.1.
|
||||
# Please do not remove it. There are currently no actions, but it
|
||||
# needs to remain intact so it does not fail when called from the
|
||||
# migrations script. Any future migrations that may apply to
|
||||
# 3.0.0-alpha.9.1 will be added to this file.
|
||||
|
||||
UP = """
|
||||
ALTER TABLE cc_files ADD COLUMN artwork VARCHAR(4096);
|
||||
|
||||
"""
|
||||
|
||||
DOWN = """
|
||||
ALTER TABLE cc_files DROP COLUMN IF EXISTS artwork;
|
||||
|
||||
"""
|
||||
|
||||
|
||||
|
|
|
@ -11,15 +11,28 @@ def get_schema_version():
|
|||
|
||||
Don't use django models as they might break in the future. Our concern is to upgrade
|
||||
the legacy database schema to the point where django is in charge of the migrations.
|
||||
|
||||
An airtime 2.5.1 migration will not have schema_version, in that case, we look for
|
||||
system_version to have a value of 2.5.1 and return that as the schema version value
|
||||
(really just needs to be anything besides None, so that the next migration doesn't overwrite
|
||||
the database)
|
||||
"""
|
||||
|
||||
if "cc_pref" not in connection.introspection.table_names():
|
||||
return None
|
||||
|
||||
with connection.cursor() as cursor:
|
||||
cursor.execute("SELECT valstr FROM cc_pref WHERE keystr = 'schema_version'")
|
||||
cursor.execute(
|
||||
"""
|
||||
SELECT valstr AS version
|
||||
FROM cc_pref
|
||||
WHERE (keystr = 'schema_version') OR (keystr = 'system_version' AND valstr = '2.5.1')
|
||||
"""
|
||||
)
|
||||
row = cursor.fetchone()
|
||||
return row[0] if row else None
|
||||
if row and row[0]:
|
||||
return row[0]
|
||||
return None
|
||||
|
||||
|
||||
def set_schema_version(cursor, version: str):
|
||||
|
|
Loading…
Reference in New Issue