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:
@@ -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
|
||||
|
||||
@@ -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 ###
|
||||
Reference in New Issue
Block a user