refactor(database): use a new 'On-Demand' design (#86)

Technical Details: https://blog.mxgame.top/2025/11/22/An-On-Demand-Design-Within-SQLModel/
This commit is contained in:
MingxuanGame
2025-11-23 21:41:02 +08:00
committed by GitHub
parent 42f1d53d3e
commit 40da994ae8
46 changed files with 4396 additions and 2354 deletions

View File

@@ -0,0 +1,498 @@
"""project: remove unused fields in database
Revision ID: 23707640303c
Revises: 3f0f22f38c3d
Create Date: 2025-11-23 08:14:05.284238
"""
from collections.abc import Sequence
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import mysql
# revision identifiers, used by Alembic.
revision: str = "23707640303c"
down_revision: str | Sequence[str] | None = "3f0f22f38c3d"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
def upgrade() -> None:
"""Upgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.alter_column(
"beatmaps",
"mode",
existing_type=mysql.ENUM(
"OSU",
"TAIKO",
"FRUITS",
"MANIA",
"OSURX",
"OSUAP",
"TAIKORX",
"FRUITSRX",
"SENTAKKI",
"TAU",
"RUSH",
"HISHIGATA",
"SOYOKAZE",
),
nullable=False,
)
op.drop_column("beatmaps", "current_user_playcount")
op.alter_column("beatmapsync", "updated_at", existing_type=mysql.DATETIME(), nullable=True)
op.alter_column(
"best_scores",
"gamemode",
existing_type=mysql.ENUM(
"OSU",
"TAIKO",
"FRUITS",
"MANIA",
"OSURX",
"OSUAP",
"TAIKORX",
"FRUITSRX",
"SENTAKKI",
"TAU",
"RUSH",
"HISHIGATA",
"SOYOKAZE",
),
nullable=False,
)
op.alter_column(
"lazer_user_statistics",
"mode",
existing_type=mysql.ENUM(
"OSU",
"TAIKO",
"FRUITS",
"MANIA",
"OSURX",
"OSUAP",
"TAIKORX",
"FRUITSRX",
"SENTAKKI",
"TAU",
"RUSH",
"HISHIGATA",
"SOYOKAZE",
),
nullable=False,
)
op.alter_column("lazer_user_statistics", "ranked_score", existing_type=mysql.BIGINT(), nullable=True)
op.alter_column(
"lazer_users",
"playmode",
existing_type=mysql.ENUM(
"OSU",
"TAIKO",
"FRUITS",
"MANIA",
"OSURX",
"OSUAP",
"TAIKORX",
"FRUITSRX",
"SENTAKKI",
"TAU",
"RUSH",
"HISHIGATA",
"SOYOKAZE",
),
nullable=False,
)
op.alter_column(
"lazer_users",
"g0v0_playmode",
existing_type=mysql.ENUM(
"OSU",
"TAIKO",
"FRUITS",
"MANIA",
"OSURX",
"OSUAP",
"TAIKORX",
"FRUITSRX",
"SENTAKKI",
"TAU",
"RUSH",
"HISHIGATA",
"SOYOKAZE",
),
nullable=False,
)
op.drop_column("lazer_users", "beatmap_playcounts_count")
op.alter_column("login_sessions", "is_new_device", existing_type=mysql.TINYINT(display_width=1), nullable=False)
op.alter_column(
"rank_history",
"mode",
existing_type=mysql.ENUM(
"OSU",
"TAIKO",
"FRUITS",
"MANIA",
"OSURX",
"OSUAP",
"TAIKORX",
"FRUITSRX",
"SENTAKKI",
"TAU",
"RUSH",
"HISHIGATA",
"SOYOKAZE",
),
nullable=False,
)
op.alter_column(
"rank_top",
"mode",
existing_type=mysql.ENUM(
"OSU",
"TAIKO",
"FRUITS",
"MANIA",
"OSURX",
"OSUAP",
"TAIKORX",
"FRUITSRX",
"SENTAKKI",
"TAU",
"RUSH",
"HISHIGATA",
"SOYOKAZE",
),
nullable=False,
)
op.alter_column(
"rooms",
"type",
existing_type=mysql.ENUM("PLAYLISTS", "HEAD_TO_HEAD", "TEAM_VERSUS", "MATCHMAKING"),
nullable=False,
)
op.execute("UPDATE rooms SET channel_id = 0 WHERE channel_id IS NULL")
op.alter_column("rooms", "channel_id", existing_type=mysql.INTEGER(), nullable=False)
op.alter_column(
"score_tokens",
"ruleset_id",
existing_type=mysql.ENUM(
"OSU",
"TAIKO",
"FRUITS",
"MANIA",
"OSURX",
"OSUAP",
"TAIKORX",
"FRUITSRX",
"SENTAKKI",
"TAU",
"RUSH",
"HISHIGATA",
"SOYOKAZE",
),
nullable=False,
)
op.alter_column(
"scores",
"gamemode",
existing_type=mysql.ENUM(
"OSU",
"TAIKO",
"FRUITS",
"MANIA",
"OSURX",
"OSUAP",
"TAIKORX",
"FRUITSRX",
"SENTAKKI",
"TAU",
"RUSH",
"HISHIGATA",
"SOYOKAZE",
),
nullable=False,
)
op.alter_column(
"teams",
"playmode",
existing_type=mysql.ENUM(
"OSU",
"TAIKO",
"FRUITS",
"MANIA",
"OSURX",
"OSUAP",
"TAIKORX",
"FRUITSRX",
"SENTAKKI",
"TAU",
"RUSH",
"HISHIGATA",
"SOYOKAZE",
),
nullable=False,
)
op.alter_column(
"total_score_best_scores",
"gamemode",
existing_type=mysql.ENUM(
"OSU",
"TAIKO",
"FRUITS",
"MANIA",
"OSURX",
"OSUAP",
"TAIKORX",
"FRUITSRX",
"SENTAKKI",
"TAU",
"RUSH",
"HISHIGATA",
"SOYOKAZE",
),
nullable=False,
)
# ### end Alembic commands ###
def downgrade() -> None:
"""Downgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.alter_column(
"total_score_best_scores",
"gamemode",
existing_type=mysql.ENUM(
"OSU",
"TAIKO",
"FRUITS",
"MANIA",
"OSURX",
"OSUAP",
"TAIKORX",
"FRUITSRX",
"SENTAKKI",
"TAU",
"RUSH",
"HISHIGATA",
"SOYOKAZE",
),
nullable=True,
)
op.alter_column(
"teams",
"playmode",
existing_type=mysql.ENUM(
"OSU",
"TAIKO",
"FRUITS",
"MANIA",
"OSURX",
"OSUAP",
"TAIKORX",
"FRUITSRX",
"SENTAKKI",
"TAU",
"RUSH",
"HISHIGATA",
"SOYOKAZE",
),
nullable=True,
)
op.alter_column(
"scores",
"gamemode",
existing_type=mysql.ENUM(
"OSU",
"TAIKO",
"FRUITS",
"MANIA",
"OSURX",
"OSUAP",
"TAIKORX",
"FRUITSRX",
"SENTAKKI",
"TAU",
"RUSH",
"HISHIGATA",
"SOYOKAZE",
),
nullable=True,
)
op.alter_column(
"score_tokens",
"ruleset_id",
existing_type=mysql.ENUM(
"OSU",
"TAIKO",
"FRUITS",
"MANIA",
"OSURX",
"OSUAP",
"TAIKORX",
"FRUITSRX",
"SENTAKKI",
"TAU",
"RUSH",
"HISHIGATA",
"SOYOKAZE",
),
nullable=True,
)
op.alter_column("rooms", "channel_id", existing_type=mysql.INTEGER(), nullable=True)
op.alter_column(
"rooms",
"type",
existing_type=mysql.ENUM("PLAYLISTS", "HEAD_TO_HEAD", "TEAM_VERSUS", "MATCHMAKING"),
nullable=True,
)
op.alter_column(
"rank_top",
"mode",
existing_type=mysql.ENUM(
"OSU",
"TAIKO",
"FRUITS",
"MANIA",
"OSURX",
"OSUAP",
"TAIKORX",
"FRUITSRX",
"SENTAKKI",
"TAU",
"RUSH",
"HISHIGATA",
"SOYOKAZE",
),
nullable=True,
)
op.alter_column(
"rank_history",
"mode",
existing_type=mysql.ENUM(
"OSU",
"TAIKO",
"FRUITS",
"MANIA",
"OSURX",
"OSUAP",
"TAIKORX",
"FRUITSRX",
"SENTAKKI",
"TAU",
"RUSH",
"HISHIGATA",
"SOYOKAZE",
),
nullable=True,
)
op.alter_column("login_sessions", "is_new_device", existing_type=mysql.TINYINT(display_width=1), nullable=True)
op.add_column(
"lazer_users", sa.Column("beatmap_playcounts_count", mysql.INTEGER(), autoincrement=False, nullable=False)
)
op.alter_column(
"lazer_users",
"g0v0_playmode",
existing_type=mysql.ENUM(
"OSU",
"TAIKO",
"FRUITS",
"MANIA",
"OSURX",
"OSUAP",
"TAIKORX",
"FRUITSRX",
"SENTAKKI",
"TAU",
"RUSH",
"HISHIGATA",
"SOYOKAZE",
),
nullable=True,
)
op.alter_column(
"lazer_users",
"playmode",
existing_type=mysql.ENUM(
"OSU",
"TAIKO",
"FRUITS",
"MANIA",
"OSURX",
"OSUAP",
"TAIKORX",
"FRUITSRX",
"SENTAKKI",
"TAU",
"RUSH",
"HISHIGATA",
"SOYOKAZE",
),
nullable=True,
)
op.alter_column("lazer_user_statistics", "ranked_score", existing_type=mysql.BIGINT(), nullable=False)
op.alter_column(
"lazer_user_statistics",
"mode",
existing_type=mysql.ENUM(
"OSU",
"TAIKO",
"FRUITS",
"MANIA",
"OSURX",
"OSUAP",
"TAIKORX",
"FRUITSRX",
"SENTAKKI",
"TAU",
"RUSH",
"HISHIGATA",
"SOYOKAZE",
),
nullable=True,
)
op.alter_column(
"best_scores",
"gamemode",
existing_type=mysql.ENUM(
"OSU",
"TAIKO",
"FRUITS",
"MANIA",
"OSURX",
"OSUAP",
"TAIKORX",
"FRUITSRX",
"SENTAKKI",
"TAU",
"RUSH",
"HISHIGATA",
"SOYOKAZE",
),
nullable=True,
)
op.alter_column("beatmapsync", "updated_at", existing_type=mysql.DATETIME(), nullable=False)
op.add_column("beatmaps", sa.Column("current_user_playcount", mysql.INTEGER(), autoincrement=False, nullable=False))
op.alter_column(
"beatmaps",
"mode",
existing_type=mysql.ENUM(
"OSU",
"TAIKO",
"FRUITS",
"MANIA",
"OSURX",
"OSUAP",
"TAIKORX",
"FRUITSRX",
"SENTAKKI",
"TAU",
"RUSH",
"HISHIGATA",
"SOYOKAZE",
),
nullable=True,
)
# ### end Alembic commands ###