fix(api): remove duplicate alembic migrations after merge
Drop legacy 0019_backfill_missing_columns and 0020_backfill_missing_schema chain so only 0019_align_legacy_schema remains as head.
This commit is contained in:
@@ -1,51 +0,0 @@
|
|||||||
"""补建缺失列:segments.audio_duration_seconds, conversations.deleted_at
|
|
||||||
|
|
||||||
0001 用 create_all 建表,对已有表不会 ALTER 追加列。
|
|
||||||
本迁移补齐 ORM 模型中存在但生产库缺失的两列。
|
|
||||||
|
|
||||||
Revision ID: 0019_backfill_missing_columns
|
|
||||||
Revises: 0018_users_language_preference
|
|
||||||
"""
|
|
||||||
|
|
||||||
from typing import Sequence, Union
|
|
||||||
|
|
||||||
import sqlalchemy as sa
|
|
||||||
|
|
||||||
from alembic import op
|
|
||||||
|
|
||||||
revision: str = "0019_backfill_missing_columns"
|
|
||||||
down_revision: Union[str, None] = "0018_users_language_preference"
|
|
||||||
branch_labels: Union[str, Sequence[str], None] = None
|
|
||||||
depends_on: Union[str, Sequence[str], None] = None
|
|
||||||
|
|
||||||
|
|
||||||
def _column_names(table_name: str) -> set[str]:
|
|
||||||
bind = op.get_bind()
|
|
||||||
inspector = sa.inspect(bind)
|
|
||||||
return {column["name"] for column in inspector.get_columns(table_name)}
|
|
||||||
|
|
||||||
|
|
||||||
def upgrade() -> None:
|
|
||||||
seg_cols = _column_names("segments")
|
|
||||||
if "audio_duration_seconds" not in seg_cols:
|
|
||||||
op.add_column(
|
|
||||||
"segments",
|
|
||||||
sa.Column("audio_duration_seconds", sa.Integer(), nullable=True),
|
|
||||||
)
|
|
||||||
|
|
||||||
conv_cols = _column_names("conversations")
|
|
||||||
if "deleted_at" not in conv_cols:
|
|
||||||
op.add_column(
|
|
||||||
"conversations",
|
|
||||||
sa.Column("deleted_at", sa.DateTime(timezone=True), nullable=True),
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def downgrade() -> None:
|
|
||||||
conv_cols = _column_names("conversations")
|
|
||||||
if "deleted_at" in conv_cols:
|
|
||||||
op.drop_column("conversations", "deleted_at")
|
|
||||||
|
|
||||||
seg_cols = _column_names("segments")
|
|
||||||
if "audio_duration_seconds" in seg_cols:
|
|
||||||
op.drop_column("segments", "audio_duration_seconds")
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
"""补建所有 ORM 模型中存在但数据库缺失的列
|
|
||||||
|
|
||||||
0001 用 create_all 建表,对已有表不会 ALTER 追加列。
|
|
||||||
本迁移自动内省 ORM 元数据与实际数据库 schema 的差异,
|
|
||||||
为每张已有表补齐缺失列(不含 FK 约束,仅补列定义)。
|
|
||||||
|
|
||||||
Revision ID: 0020_backfill_all_missing_columns
|
|
||||||
Revises: 0019_backfill_missing_columns
|
|
||||||
"""
|
|
||||||
|
|
||||||
from __future__ import annotations
|
|
||||||
|
|
||||||
from typing import Sequence, Union
|
|
||||||
|
|
||||||
import sqlalchemy as sa
|
|
||||||
|
|
||||||
from alembic import op
|
|
||||||
|
|
||||||
revision: str = "0020_backfill_missing_schema"
|
|
||||||
down_revision: Union[str, None] = "0019_backfill_missing_columns"
|
|
||||||
branch_labels: Union[str, Sequence[str], None] = None
|
|
||||||
depends_on: Union[str, Sequence[str], None] = None
|
|
||||||
|
|
||||||
|
|
||||||
def _import_all_models() -> None:
|
|
||||||
from app.features.asset import models as _asset # noqa: F401
|
|
||||||
from app.features.auth import models as _auth # noqa: F401
|
|
||||||
from app.features.conversation import models as _conv # noqa: F401
|
|
||||||
from app.features.evaluation import models as _eval # noqa: F401
|
|
||||||
from app.features.memory import models as _memory # noqa: F401
|
|
||||||
from app.features.memoir import models as _memoir # noqa: F401
|
|
||||||
from app.features.payment import models as _payment # noqa: F401
|
|
||||||
from app.features.story import models as _story # noqa: F401
|
|
||||||
from app.features.user import models as _user # noqa: F401
|
|
||||||
|
|
||||||
|
|
||||||
def upgrade() -> None:
|
|
||||||
from app.core.db import Base
|
|
||||||
|
|
||||||
_import_all_models()
|
|
||||||
|
|
||||||
bind = op.get_bind()
|
|
||||||
inspector = sa.inspect(bind)
|
|
||||||
existing_tables = set(inspector.get_table_names())
|
|
||||||
|
|
||||||
for table in Base.metadata.sorted_tables:
|
|
||||||
if table.name not in existing_tables:
|
|
||||||
continue
|
|
||||||
|
|
||||||
db_cols = {c["name"] for c in inspector.get_columns(table.name)}
|
|
||||||
|
|
||||||
for col in table.columns:
|
|
||||||
if col.name in db_cols:
|
|
||||||
continue
|
|
||||||
|
|
||||||
kwargs: dict = {"nullable": True}
|
|
||||||
|
|
||||||
if col.server_default is not None:
|
|
||||||
kwargs["server_default"] = col.server_default.arg
|
|
||||||
|
|
||||||
new_col = sa.Column(col.name, col.type, **kwargs)
|
|
||||||
op.add_column(table.name, new_col)
|
|
||||||
|
|
||||||
|
|
||||||
def downgrade() -> None:
|
|
||||||
pass
|
|
||||||
Reference in New Issue
Block a user