"""add wechat identity fields Revision ID: 20260507_add_wechat_identity Revises: 20260501_add_reading_corner Create Date: 2026-05-07 10:00:00 """ from __future__ import annotations from alembic import op import sqlalchemy as sa revision = "20260507_add_wechat_identity" down_revision = "20260501_add_reading_corner" branch_labels = None depends_on = None def _has_column(inspector: sa.Inspector, table_name: str, column_name: str) -> bool: return column_name in {column["name"] for column in inspector.get_columns(table_name)} def upgrade() -> None: bind = op.get_bind() inspector = sa.inspect(bind) tables = set(inspector.get_table_names()) if "users" not in tables: return if not _has_column(inspector, "users", "wechat_openid"): op.add_column("users", sa.Column("wechat_openid", sa.String(length=128), nullable=True)) if not _has_column(inspector, "users", "wechat_unionid"): op.add_column("users", sa.Column("wechat_unionid", sa.String(length=128), nullable=True)) if not _has_column(inspector, "users", "phone_verified_at"): op.add_column("users", sa.Column("phone_verified_at", sa.DateTime(), nullable=True)) inspector = sa.inspect(bind) indexes = {index["name"] for index in inspector.get_indexes("users")} if "ix_users_wechat_openid" not in indexes: op.create_index("ix_users_wechat_openid", "users", ["wechat_openid"], unique=True) def downgrade() -> None: bind = op.get_bind() inspector = sa.inspect(bind) tables = set(inspector.get_table_names()) if "users" not in tables: return indexes = {index["name"] for index in inspector.get_indexes("users")} if "ix_users_wechat_openid" in indexes: op.drop_index("ix_users_wechat_openid", table_name="users") inspector = sa.inspect(bind) if _has_column(inspector, "users", "phone_verified_at"): op.drop_column("users", "phone_verified_at") inspector = sa.inspect(bind) if _has_column(inspector, "users", "wechat_unionid"): op.drop_column("users", "wechat_unionid") inspector = sa.inspect(bind) if _has_column(inspector, "users", "wechat_openid"): op.drop_column("users", "wechat_openid")