"""rename tables so every module prefixes its own Two tables were named after the concept they came from rather than the module they belong to, which made the schema read as if the template tables were part of the paper module: paper_template -> template the 模板 module section_field -> template_field_library the 字段库, which the 模板 module owns and every template draws on The paper module (``paper``, ``paper_sentence``, ``paper_sentence_reference``) and the join table (``template_field``) already followed the rule and are not touched. After this revision the naming is: template template_field template_field_library paper paper_sentence paper_sentence_reference A rename, not a copy: ``RENAME TABLE`` moves the rows and leaves the data in place, and TiDB carries a referencing foreign key along with the renamed table (verified against the running cluster before this migration was written), so the constraints in ``template_field``, ``paper`` and ``paper_sentence`` now point at ``template`` and ``template_field_library`` with no drop/recreate step. Index names are left alone: they are per-table in MySQL and TiDB, and ``template_field`` — whose indexes embed its own name — is not renamed. Revision ID: f27a1c6d9e04 Revises: c41d7b09e5af Create Date: 2026-09-18 """ from collections.abc import Sequence from alembic import op # revision identifiers, used by Alembic. revision: str = "f27a1c6d9e04" down_revision: str | None = "c41d7b09e5af" branch_labels: str | Sequence[str] | None = None depends_on: str | Sequence[str] | None = None def upgrade() -> None: op.rename_table("paper_template", "template") op.rename_table("section_field", "template_field_library") def downgrade() -> None: op.rename_table("template_field_library", "section_field") op.rename_table("template", "paper_template")