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