fix(db): unify table name prefix to mjk_ for update tables
- Rename app_releases → mjk_app_releases - Rename release_packages → mjk_release_packages - Update ForeignKey reference and migration file - Add pre-commit hook: check_table_prefix.py to prevent future violations
This commit is contained in:
@@ -41,3 +41,13 @@ repos:
|
||||
language: system
|
||||
files: ^(pyproject\.toml|requirements\.lock)$
|
||||
pass_filenames: false
|
||||
|
||||
# 模型表名前缀一致性检查
|
||||
- repo: local
|
||||
hooks:
|
||||
- id: table-prefix-check
|
||||
name: Check model __tablename__ has mjk_ prefix
|
||||
entry: python scripts/check_table_prefix.py
|
||||
language: system
|
||||
files: ^app/models/.*\.py$
|
||||
pass_filenames: false
|
||||
|
||||
@@ -21,7 +21,7 @@ depends_on: Union[str, Sequence[str], None] = None
|
||||
def upgrade() -> None:
|
||||
"""Upgrade schema."""
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.create_table('app_releases',
|
||||
op.create_table('mjk_app_releases',
|
||||
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
|
||||
sa.Column('version', sa.String(length=20), nullable=False),
|
||||
sa.Column('release_date', sa.DateTime(timezone=True), nullable=False),
|
||||
@@ -30,7 +30,7 @@ def upgrade() -> None:
|
||||
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
|
||||
sa.PrimaryKeyConstraint('id')
|
||||
)
|
||||
op.create_index(op.f('ix_app_releases_version'), 'app_releases', ['version'], unique=True)
|
||||
op.create_index(op.f('ix_mjk_app_releases_version'), 'mjk_app_releases', ['version'], unique=True)
|
||||
op.create_table('mjk_broll_categories',
|
||||
sa.Column('slug', sa.String(length=128), nullable=False, comment='分类标识符,URL友好格式'),
|
||||
sa.Column('name', sa.String(length=256), nullable=False, comment='分类中文名称,三级分类直接对应 scene 标准化后的值'),
|
||||
@@ -178,7 +178,7 @@ def upgrade() -> None:
|
||||
sa.ForeignKeyConstraint(['category_id'], ['mjk_broll_categories.id'], ),
|
||||
sa.PrimaryKeyConstraint('id')
|
||||
)
|
||||
op.create_table('release_packages',
|
||||
op.create_table('mjk_release_packages',
|
||||
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
|
||||
sa.Column('release_id', sa.Integer(), nullable=False),
|
||||
sa.Column('platform', sa.String(length=20), nullable=False),
|
||||
@@ -189,7 +189,7 @@ def upgrade() -> None:
|
||||
sa.Column('signature', sa.Text(), nullable=False),
|
||||
sa.Column('download_count', sa.Integer(), nullable=False),
|
||||
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
|
||||
sa.ForeignKeyConstraint(['release_id'], ['app_releases.id'], ondelete='CASCADE'),
|
||||
sa.ForeignKeyConstraint(['release_id'], ['mjk_app_releases.id'], ondelete='CASCADE'),
|
||||
sa.PrimaryKeyConstraint('id'),
|
||||
sa.UniqueConstraint('release_id', 'platform', 'architecture', name='uix_pkg_platform_arch')
|
||||
)
|
||||
@@ -199,7 +199,7 @@ def upgrade() -> None:
|
||||
def downgrade() -> None:
|
||||
"""Downgrade schema."""
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.drop_table('release_packages')
|
||||
op.drop_table('mjk_release_packages')
|
||||
op.drop_table('mjk_broll_materials')
|
||||
op.drop_table('mjk_users')
|
||||
op.drop_table('mjk_user_points')
|
||||
@@ -210,6 +210,6 @@ def downgrade() -> None:
|
||||
op.drop_table('mjk_cover_backgrounds')
|
||||
op.drop_table('mjk_broll_tags')
|
||||
op.drop_table('mjk_broll_categories')
|
||||
op.drop_index(op.f('ix_app_releases_version'), table_name='app_releases')
|
||||
op.drop_table('app_releases')
|
||||
op.drop_index(op.f('ix_mjk_app_releases_version'), table_name='mjk_app_releases')
|
||||
op.drop_table('mjk_app_releases')
|
||||
# ### end Alembic commands ###
|
||||
|
||||
@@ -16,7 +16,7 @@ from app.db.session import Base
|
||||
class AppRelease(Base):
|
||||
"""应用版本发布记录"""
|
||||
|
||||
__tablename__ = "app_releases"
|
||||
__tablename__ = "mjk_app_releases"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
version: Mapped[str] = mapped_column(String(20), unique=True, nullable=False, index=True)
|
||||
@@ -38,12 +38,12 @@ class AppRelease(Base):
|
||||
class ReleasePackage(Base):
|
||||
"""平台安装包信息"""
|
||||
|
||||
__tablename__ = "release_packages"
|
||||
__tablename__ = "mjk_release_packages"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
release_id: Mapped[int] = mapped_column(
|
||||
Integer,
|
||||
ForeignKey("app_releases.id", ondelete="CASCADE"),
|
||||
ForeignKey("mjk_app_releases.id", ondelete="CASCADE"),
|
||||
nullable=False,
|
||||
)
|
||||
platform: Mapped[str] = mapped_column(String(20), nullable=False)
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
检查所有模型的 __tablename__ 是否以 mjk_ 开头
|
||||
|
||||
用法:
|
||||
python scripts/check_table_prefix.py
|
||||
|
||||
退出码:
|
||||
0 - 所有表名合规
|
||||
1 - 有表名缺少 mjk_ 前缀
|
||||
"""
|
||||
|
||||
import re
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
MODELS_DIR = Path("app/models")
|
||||
TABLENAME_RE = re.compile(r'__tablename__\s*=\s*"([^"]+)"')
|
||||
|
||||
|
||||
def check() -> int:
|
||||
violations = []
|
||||
|
||||
for py_file in sorted(MODELS_DIR.glob("*.py")):
|
||||
content = py_file.read_text(encoding="utf-8")
|
||||
for match in TABLENAME_RE.finditer(content):
|
||||
table_name = match.group(1)
|
||||
if not table_name.startswith("mjk_"):
|
||||
violations.append((py_file.name, table_name))
|
||||
|
||||
if violations:
|
||||
print("❌ 表名前缀检查失败:以下模型的 __tablename__ 缺少 'mjk_' 前缀\n")
|
||||
for filename, table_name in violations:
|
||||
print(f" {filename}: __tablename__ = \"{table_name}\"")
|
||||
print(
|
||||
"\n修复方式:将表名改为 mjk_<name> 格式,与其他模型保持一致。\n"
|
||||
)
|
||||
return 1
|
||||
|
||||
print("✅ 所有模型表名均以 'mjk_' 开头")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(check())
|
||||
Reference in New Issue
Block a user