From 96aca7d39bd9f331a4dc73d0b6e500ad5904a939 Mon Sep 17 00:00:00 2001 From: Koncept Kit <63216427+konceptkit@users.noreply.github.com> Date: Mon, 5 Jan 2026 17:15:16 +0700 Subject: [PATCH] Alembic Database fix --- alembic/versions/011_align_prod_with_dev.py | 36 +++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/alembic/versions/011_align_prod_with_dev.py b/alembic/versions/011_align_prod_with_dev.py index f89017a..42bc60f 100644 --- a/alembic/versions/011_align_prod_with_dev.py +++ b/alembic/versions/011_align_prod_with_dev.py @@ -82,7 +82,39 @@ def upgrade() -> None: except Exception as e: print(f" ⚠️ Warning: Some type conversions failed: {e}") - # Fix nullable constraints to match DEV + # Fill NULL values with defaults BEFORE setting NOT NULL constraints + print(" ⏳ Filling NULL values with defaults...") + + # Update string fields + conn.execute(sa.text("UPDATE users SET address = '' WHERE address IS NULL")) + conn.execute(sa.text("UPDATE users SET city = '' WHERE city IS NULL")) + conn.execute(sa.text("UPDATE users SET state = '' WHERE state IS NULL")) + conn.execute(sa.text("UPDATE users SET zipcode = '' WHERE zipcode IS NULL")) + conn.execute(sa.text("UPDATE users SET phone = '' WHERE phone IS NULL")) + + # Update date_of_birth with sentinel date + conn.execute(sa.text("UPDATE users SET date_of_birth = '1900-01-01'::timestamp WHERE date_of_birth IS NULL")) + + # Update boolean fields + conn.execute(sa.text("UPDATE users SET show_in_directory = false WHERE show_in_directory IS NULL")) + conn.execute(sa.text("UPDATE users SET newsletter_publish_name = false WHERE newsletter_publish_name IS NULL")) + conn.execute(sa.text("UPDATE users SET newsletter_publish_birthday = false WHERE newsletter_publish_birthday IS NULL")) + conn.execute(sa.text("UPDATE users SET newsletter_publish_photo = false WHERE newsletter_publish_photo IS NULL")) + conn.execute(sa.text("UPDATE users SET newsletter_publish_none = false WHERE newsletter_publish_none IS NULL")) + conn.execute(sa.text("UPDATE users SET force_password_change = false WHERE force_password_change IS NULL")) + conn.execute(sa.text("UPDATE users SET scholarship_requested = false WHERE scholarship_requested IS NULL")) + conn.execute(sa.text("UPDATE users SET accepts_tos = false WHERE accepts_tos IS NULL")) + + # Check how many rows were updated + null_check = conn.execute(sa.text(""" + SELECT + COUNT(*) FILTER (WHERE address = '') as address_filled, + COUNT(*) FILTER (WHERE date_of_birth = '1900-01-01'::timestamp) as dob_filled + FROM users + """)).fetchone() + print(f" ✓ Filled NULLs: {null_check[0]} addresses, {null_check[1]} dates of birth") + + # Now safe to set NOT NULL constraints op.alter_column('users', 'address', nullable=False) op.alter_column('users', 'city', nullable=False) op.alter_column('users', 'state', nullable=False) @@ -97,7 +129,7 @@ def upgrade() -> None: op.alter_column('users', 'force_password_change', nullable=False) op.alter_column('users', 'scholarship_requested', nullable=False) op.alter_column('users', 'accepts_tos', nullable=False) - print(" ✓ Fixed nullable constraints") + print(" ✓ Set NOT NULL constraints") # ============================================================ # 2. FIX DONATIONS TABLE