From 6ce04ab2efb3d130d8c035b5fa47dc9085630739 Mon Sep 17 00:00:00 2001 From: Tobias Macey Date: Mon, 20 Oct 2025 10:54:45 -0400 Subject: [PATCH] fix: Convert UUIDField columns to uuid type for MariaDB Converts UUIDField columns from char(32) to uuid type for MariaDB Django 5 compatibility. This migration converts the following columns: - user_tasks_usertaskstatus.uuid - user_tasks_usertaskartifact.uuid See: https://docs.djangoproject.com/en/5.2/releases/5.0/#migrating-uuidfield --- user_tasks/__init__.py | 2 +- .../0005_mariadb_uuid_conversion.py | 82 +++++++++++++++++++ 2 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 user_tasks/migrations/0005_mariadb_uuid_conversion.py diff --git a/user_tasks/__init__.py b/user_tasks/__init__.py index 4615993b..54076234 100644 --- a/user_tasks/__init__.py +++ b/user_tasks/__init__.py @@ -4,7 +4,7 @@ from django.dispatch import Signal -__version__ = '3.4.3' +__version__ = '3.4.4' # This signal is emitted when a user task reaches any final state: diff --git a/user_tasks/migrations/0005_mariadb_uuid_conversion.py b/user_tasks/migrations/0005_mariadb_uuid_conversion.py new file mode 100644 index 00000000..bbb15637 --- /dev/null +++ b/user_tasks/migrations/0005_mariadb_uuid_conversion.py @@ -0,0 +1,82 @@ +# Generated migration for MariaDB UUID field conversion (Django 5.2) +""" +Migration to convert UUIDField from char(32) to uuid type for MariaDB compatibility. + +This migration is necessary because Django 5 changed the behavior of UUIDField for MariaDB +databases from using CharField(32) to using a proper UUID type. This change isn't managed +automatically, so we need to generate migrations to safely convert the columns. + +This migration only executes for MariaDB databases and is a no-op for other backends. + +See: https://www.albertyw.com/note/django-5-mariadb-uuidfield +""" + +from django.db import migrations + + +def apply_mariadb_migration(apps, schema_editor): + """Apply the migration only for MariaDB databases.""" + connection = schema_editor.connection + + # Check if this is a MariaDB database + if connection.vendor != 'mysql': + return + + # Additional check for MariaDB specifically (vs MySQL) + with connection.cursor() as cursor: + cursor.execute("SELECT VERSION()") + version = cursor.fetchone()[0] + if 'mariadb' not in version.lower(): + return + + # Apply the field changes for MariaDB + with connection.cursor() as cursor: + cursor.execute( + "ALTER TABLE user_tasks_usertaskstatus " + "MODIFY uuid uuid NOT NULL" + ) + cursor.execute( + "ALTER TABLE user_tasks_usertaskartifact " + "MODIFY uuid uuid NOT NULL" + ) + + +def reverse_mariadb_migration(apps, schema_editor): + """Reverse the migration only for MariaDB databases.""" + connection = schema_editor.connection + + # Check if this is a MariaDB database + if connection.vendor != 'mysql': + return + + # Additional check for MariaDB specifically (vs MySQL) + with connection.cursor() as cursor: + cursor.execute("SELECT VERSION()") + version = cursor.fetchone()[0] + if 'mariadb' not in version.lower(): + return + + # Reverse the field changes for MariaDB + with connection.cursor() as cursor: + cursor.execute( + "ALTER TABLE user_tasks_usertaskstatus " + "MODIFY uuid char(32) NOT NULL" + ) + cursor.execute( + "ALTER TABLE user_tasks_usertaskartifact " + "MODIFY uuid char(32) NOT NULL" + ) + + +class Migration(migrations.Migration): + + dependencies = [ + ('user_tasks', '0004_url_textfield'), + ] + + operations = [ + migrations.RunPython( + code=apply_mariadb_migration, + reverse_code=reverse_mariadb_migration, + ), + ]