mirror of
https://github.com/A-Minos/nonebot-plugin-tetris-stats.git
synced 2026-02-03 18:45:32 +08:00
Some checks failed
Code Coverage / Test (macos-latest, 3.10) (push) Has been cancelled
Code Coverage / Test (macos-latest, 3.11) (push) Has been cancelled
Code Coverage / Test (macos-latest, 3.12) (push) Has been cancelled
Code Coverage / Test (macos-latest, 3.13) (push) Has been cancelled
Code Coverage / Test (macos-latest, 3.14) (push) Has been cancelled
Code Coverage / Test (ubuntu-latest, 3.10) (push) Has been cancelled
Code Coverage / Test (ubuntu-latest, 3.11) (push) Has been cancelled
Code Coverage / Test (ubuntu-latest, 3.12) (push) Has been cancelled
Code Coverage / Test (ubuntu-latest, 3.13) (push) Has been cancelled
Code Coverage / Test (ubuntu-latest, 3.14) (push) Has been cancelled
Code Coverage / Test (windows-latest, 3.10) (push) Has been cancelled
Code Coverage / Test (windows-latest, 3.11) (push) Has been cancelled
Code Coverage / Test (windows-latest, 3.12) (push) Has been cancelled
Code Coverage / Test (windows-latest, 3.13) (push) Has been cancelled
Code Coverage / Test (windows-latest, 3.14) (push) Has been cancelled
TypeCheck / TypeCheck (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Code Coverage / check (push) Has been cancelled
Migrate Pydantic JSON columns to objects and tighten serialization to avoid string-encoded JSON.
87 lines
3.0 KiB
Python
87 lines
3.0 KiB
Python
from collections.abc import Callable, Sequence
|
|
from datetime import datetime
|
|
from typing import Any
|
|
|
|
from nonebot.compat import PYDANTIC_V2, type_validate_python
|
|
from nonebot_plugin_orm import Model
|
|
from pydantic import BaseModel, ValidationError
|
|
from sqlalchemy import JSON, DateTime, Dialect, String, TypeDecorator
|
|
from sqlalchemy.orm import Mapped, MappedAsDataclass, mapped_column
|
|
from typing_extensions import override
|
|
|
|
from ..utils.typedefs import AllCommandType, GameType
|
|
|
|
|
|
class PydanticType(TypeDecorator):
|
|
impl = JSON
|
|
|
|
@override
|
|
def __init__(
|
|
self,
|
|
get_model: Sequence[Callable[[], Sequence[type[BaseModel]]]],
|
|
models: set[type[BaseModel]],
|
|
*args: Any,
|
|
**kwargs: Any,
|
|
):
|
|
self.get_model = get_model
|
|
self._models = models
|
|
super().__init__(*args, **kwargs)
|
|
|
|
if PYDANTIC_V2:
|
|
|
|
@override
|
|
def process_bind_param(self, value: Any | None, dialect: Dialect) -> dict | list:
|
|
# 将 Pydantic 模型实例转换为 JSON
|
|
if isinstance(value, tuple(self.models)):
|
|
return value.model_dump(mode='json', by_alias=True) # type: ignore[union-attr]
|
|
raise TypeError
|
|
else:
|
|
|
|
@override
|
|
def process_bind_param(self, value: Any | None, dialect: Dialect) -> dict | list:
|
|
# 将 Pydantic 模型实例转换为 JSON
|
|
if isinstance(value, tuple(self.models)):
|
|
return value.dict(by_alias=True) # type: ignore[union-attr]
|
|
raise TypeError
|
|
|
|
@override
|
|
def process_result_value(self, value: Any | None, dialect: Dialect) -> BaseModel:
|
|
# 将 JSON 转换回 Pydantic 模型实例
|
|
if isinstance(value, dict | list):
|
|
for i in self.models:
|
|
try:
|
|
return type_validate_python(i, value)
|
|
except ValidationError: # noqa: PERF203
|
|
...
|
|
raise ValueError
|
|
|
|
@property
|
|
def models(self) -> tuple[type[BaseModel], ...]:
|
|
models: set[type[BaseModel]] = set()
|
|
for i in self.get_model:
|
|
models.update(i())
|
|
models.update(self._models)
|
|
return tuple(models)
|
|
|
|
|
|
class Bind(MappedAsDataclass, Model):
|
|
__tablename__ = 'nb_t_bind'
|
|
|
|
id: Mapped[int] = mapped_column(init=False, primary_key=True)
|
|
user_id: Mapped[int] = mapped_column(index=True)
|
|
game_platform: Mapped[GameType] = mapped_column(String(32))
|
|
game_account: Mapped[str]
|
|
verify: Mapped[bool]
|
|
|
|
|
|
class TriggerHistoricalDataV2(MappedAsDataclass, Model):
|
|
__tablename__ = 'nb_t_trigger_hist_v2'
|
|
|
|
id: Mapped[int] = mapped_column(init=False, primary_key=True)
|
|
trigger_time: Mapped[datetime] = mapped_column(DateTime)
|
|
session_persist_id: Mapped[int]
|
|
game_platform: Mapped[GameType] = mapped_column(String(32), index=True)
|
|
command_type: Mapped[AllCommandType] = mapped_column(String(16), index=True)
|
|
command_args: Mapped[list[str]] = mapped_column(JSON)
|
|
finish_time: Mapped[datetime] = mapped_column(DateTime)
|