From 653be7755b514154d086d701eb73daada63687ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=81=B5=E5=BA=94?= Date: Tue, 7 Jul 2026 07:53:27 +0800 Subject: [PATCH] fix: handle Alembic offline mode in migration _column_exists() helper The _column_exists() helper in migrations 026-029 calls conn.execute() which returns None in Alembic's offline/SQL mode (--sql flag), causing AttributeError on result.scalar(). Add context.is_offline_mode() guard to skip the idempotency check in offline mode and unconditionally emit the DDL statements. Fixes: Validate CI step 'alembic upgrade head --sql' failure. --- alembic/versions/026_add_user_profile_fields.py | 4 +++- alembic/versions/027_add_user_ban_fields.py | 4 +++- alembic/versions/028_add_user_admin_fields.py | 4 +++- alembic/versions/029_add_user_phone.py | 4 +++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/alembic/versions/026_add_user_profile_fields.py b/alembic/versions/026_add_user_profile_fields.py index 353635a23..6e0c0482d 100644 --- a/alembic/versions/026_add_user_profile_fields.py +++ b/alembic/versions/026_add_user_profile_fields.py @@ -10,7 +10,7 @@ Create Date: 2026-07-05 import sqlalchemy as sa -from alembic import op +from alembic import context, op revision = "026" down_revision = "025" @@ -19,6 +19,8 @@ depends_on = None def _column_exists(table: str, column: str) -> bool: + if context.is_offline_mode(): + return False conn = op.get_bind() result = conn.execute( sa.text( diff --git a/alembic/versions/027_add_user_ban_fields.py b/alembic/versions/027_add_user_ban_fields.py index 53ca97068..e59908b66 100644 --- a/alembic/versions/027_add_user_ban_fields.py +++ b/alembic/versions/027_add_user_ban_fields.py @@ -10,7 +10,7 @@ Create Date: 2026-07-05 import sqlalchemy as sa -from alembic import op +from alembic import context, op revision = "027" down_revision = "026" @@ -19,6 +19,8 @@ depends_on = None def _column_exists(table: str, column: str) -> bool: + if context.is_offline_mode(): + return False conn = op.get_bind() result = conn.execute( sa.text( diff --git a/alembic/versions/028_add_user_admin_fields.py b/alembic/versions/028_add_user_admin_fields.py index 9983d05aa..5c1c67c84 100644 --- a/alembic/versions/028_add_user_admin_fields.py +++ b/alembic/versions/028_add_user_admin_fields.py @@ -10,7 +10,7 @@ Create Date: 2026-07-05 import sqlalchemy as sa -from alembic import op +from alembic import context, op revision = "028" down_revision = "027" @@ -19,6 +19,8 @@ depends_on = None def _column_exists(table: str, column: str) -> bool: + if context.is_offline_mode(): + return False conn = op.get_bind() result = conn.execute( sa.text( diff --git a/alembic/versions/029_add_user_phone.py b/alembic/versions/029_add_user_phone.py index 963e88cf1..310b02c0d 100644 --- a/alembic/versions/029_add_user_phone.py +++ b/alembic/versions/029_add_user_phone.py @@ -10,7 +10,7 @@ Create Date: 2026-07-05 import sqlalchemy as sa -from alembic import op +from alembic import context, op revision = "029" down_revision = "028" @@ -19,6 +19,8 @@ depends_on = None def _column_exists(table: str, column: str) -> bool: + if context.is_offline_mode(): + return False conn = op.get_bind() result = conn.execute( sa.text(