artemis/titles/idac/schema/factory.py
Dniel97 e50fedad49
round database implenments
round database implenments

idac: database upgrade script

idac: unused upgrade script

idac: even more round event implements

idac: some bugfixes

idac: convert round event file to UTF-8

idac: async round info loading

idac: last round ranking impl

idac: bugfixes

idac: bugfixes

idac: bugfixes

idac: 160~240 number plate implemented

idac: remove SQL comment

idac: sort things out and make multi-season compatibility
2024-06-12 21:11:25 +02:00

60 lines
1.9 KiB
Python

from typing import Dict, Optional, List
from sqlalchemy import (
Table,
Column,
UniqueConstraint,
PrimaryKeyConstraint,
and_,
update,
)
from sqlalchemy.types import Integer, String, TIMESTAMP, Boolean, JSON
from sqlalchemy.schema import ForeignKey
from sqlalchemy.engine import Row
from sqlalchemy.sql import func, select
from sqlalchemy.dialects.mysql import insert
from core.data.schema import BaseData, metadata
lottery = Table(
"idac_user_lottery",
metadata,
Column("id", Integer, primary_key=True, nullable=False),
Column("user", ForeignKey("aime_user.id", ondelete="cascade", onupdate="cascade")),
Column("version", Integer, nullable=False),
Column("saved_value", Integer, nullable=False),
Column("lottery_count", Integer, nullable=False),
UniqueConstraint("user", "version", name="idac_user_lottery_uk"),
mysql_charset="utf8mb4",
)
class IDACFactoryData(BaseData):
async def get_lottery(self, aime_id: int, version: int) -> Optional[Row]:
sql = select(lottery).where(
and_(
lottery.c.user == aime_id,
lottery.c.version == version
)
)
result = await self.execute(sql)
if result is None:
return None
return result.fetchone()
async def put_lottery(
self, aime_id: int, version: int, saved_value: int, lottery_count: int
) -> Optional[int]:
lottery_data = {}
lottery_data["user"] = aime_id
lottery_data["version"] = version
lottery_data["saved_value"] = saved_value
lottery_data["lottery_count"] = lottery_count
sql = insert(lottery).values(**lottery_data)
conflict = sql.on_duplicate_key_update(**lottery_data)
result = await self.execute(conflict)
if result is None:
self.logger.warn(f"put_lottery: Failed to update! aime_id: {aime_id}")
return None
return result.lastrowid