feat(database): 将 Event.event_payload 字段从 str 改为 dict/json

- 在 events.py 中,将 event_payload 字段的类型从 str 改为 dict,并使用 JSON 类型存储
- 添加新的迁移文件,将数据库中的 event_payload 列从 VARCHAR 类型改为 JSON 类型
- 更新 EventResp 类,移除 _payload 属性,直接使用 event_payload 字段
This commit is contained in:
chenjintang-shrimp
2025-08-13 06:21:22 +00:00
parent 29eb85bc4a
commit 1dde8a40da
2 changed files with 144 additions and 11 deletions

View File

@@ -1,9 +1,9 @@
from datetime import UTC, datetime
from enum import Enum
import json
from typing import TYPE_CHECKING
from sqlmodel import (
JSON,
BigInteger,
Column,
DateTime,
@@ -40,7 +40,9 @@ class EventBase(SQLModel):
sa_column=Column(DateTime(timezone=True), default=datetime.now(UTC))
)
type: EventType
event_payload: str
event_payload: dict = Field(
exclude=True, default_factory=dict, sa_column=Column(JSON)
)
class Event(EventBase, table=True):
@@ -53,15 +55,9 @@ class Event(EventBase, table=True):
class EventResp(EventBase):
_payload: dict
def merge_payload(self) -> "EventResp":
parsed = {}
try:
parsed = json.loads(self.event_payload or "{}")
except json.JSONDecodeError:
parsed = {}
for key, value in parsed.items():
for key, value in self.event_payload.items():
setattr(self, key, value)
self._payload = parsed
return self
pass

View File

@@ -0,0 +1,137 @@
"""convert Event.event_payload from str to json
Revision ID: f785165a5c0b
Revises: 881ac7ca01d5
Create Date: 2025-08-13 06:02:11.911557
"""
from __future__ import annotations
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 = "f785165a5c0b"
down_revision: str | Sequence[str] | None = "881ac7ca01d5"
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"),
nullable=False,
)
op.alter_column(
"best_scores",
"gamemode",
existing_type=mysql.ENUM("OSU", "TAIKO", "FRUITS", "MANIA", "OSURX", "OSUAP"),
nullable=False,
)
op.alter_column(
"lazer_user_statistics",
"mode",
existing_type=mysql.ENUM("OSU", "TAIKO", "FRUITS", "MANIA", "OSURX", "OSUAP"),
nullable=False,
)
op.alter_column(
"lazer_users",
"playmode",
existing_type=mysql.ENUM("OSU", "TAIKO", "FRUITS", "MANIA", "OSURX", "OSUAP"),
nullable=False,
)
op.alter_column(
"monthly_playcounts", "count", existing_type=mysql.INTEGER(), nullable=False
)
op.alter_column(
"score_tokens",
"ruleset_id",
existing_type=mysql.ENUM("OSU", "TAIKO", "FRUITS", "MANIA", "OSURX", "OSUAP"),
nullable=False,
)
op.alter_column(
"scores",
"gamemode",
existing_type=mysql.ENUM("OSU", "TAIKO", "FRUITS", "MANIA", "OSURX", "OSUAP"),
nullable=False,
)
op.alter_column(
"total_score_best_scores",
"gamemode",
existing_type=mysql.ENUM("OSU", "TAIKO", "FRUITS", "MANIA", "OSURX", "OSUAP"),
nullable=False,
)
op.alter_column(
"user_events",
"event_payload",
existing_type=mysql.VARCHAR(length=255),
type_=sa.JSON(),
nullable=True,
)
# ### end Alembic commands ###
def downgrade() -> None:
"""Downgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.alter_column(
"user_events",
"event_payload",
existing_type=sa.JSON(),
type_=mysql.VARCHAR(length=255),
nullable=False,
)
op.alter_column(
"total_score_best_scores",
"gamemode",
existing_type=mysql.ENUM("OSU", "TAIKO", "FRUITS", "MANIA", "OSURX", "OSUAP"),
nullable=True,
)
op.alter_column(
"scores",
"gamemode",
existing_type=mysql.ENUM("OSU", "TAIKO", "FRUITS", "MANIA", "OSURX", "OSUAP"),
nullable=True,
)
op.alter_column(
"score_tokens",
"ruleset_id",
existing_type=mysql.ENUM("OSU", "TAIKO", "FRUITS", "MANIA", "OSURX", "OSUAP"),
nullable=True,
)
op.alter_column(
"monthly_playcounts", "count", existing_type=mysql.INTEGER(), nullable=True
)
op.alter_column(
"lazer_users",
"playmode",
existing_type=mysql.ENUM("OSU", "TAIKO", "FRUITS", "MANIA", "OSURX", "OSUAP"),
nullable=True,
)
op.alter_column(
"lazer_user_statistics",
"mode",
existing_type=mysql.ENUM("OSU", "TAIKO", "FRUITS", "MANIA", "OSURX", "OSUAP"),
nullable=True,
)
op.alter_column(
"best_scores",
"gamemode",
existing_type=mysql.ENUM("OSU", "TAIKO", "FRUITS", "MANIA", "OSURX", "OSUAP"),
nullable=True,
)
op.alter_column(
"beatmaps",
"mode",
existing_type=mysql.ENUM("OSU", "TAIKO", "FRUITS", "MANIA", "OSURX", "OSUAP"),
nullable=True,
)
# ### end Alembic commands ###