Update aiogram 3 template

This commit is contained in:
dj
2026-05-29 09:44:39 +03:00
parent e144cb1424
commit 2eced5dc4f
43 changed files with 1877 additions and 1252 deletions
+87 -59
View File
@@ -1,78 +1,106 @@
# - *- coding: utf- 8 - *-
import sqlite3
from sqlalchemy import BigInteger, Integer, String, or_
from sqlalchemy import update as sqlalchemy_update
from sqlalchemy.dialects.sqlite import insert
from sqlalchemy.orm import Mapped, mapped_column
from pydantic import BaseModel
from tgbot.data.config import PATH_DATABASE
from tgbot.database.adb_helper import Databasex, dict_factory, update_format
from tgbot.utils.const_functions import get_unix, ded
from tgbot.database.core import Base, session_scope
from tgbot.database.repository import BaseRepository
from tgbot.utils.const_functions import get_unix
# Table model
class ModelBase(BaseModel):
increment: int # increment
user_id: int # User id
user_login: str # User username
user_name: str # User name
user_surname: str # User surname
user_fullname: str # User fullname (name + surname)
user_unix: int # Date of user registration in the bot (in UNIX time)
# Модель пользователя Telegram
class UserModel(Base):
__tablename__ = "storage_users"
class Config:
json_schema_extra = {
'storage_name': 'storage_users'
}
increment: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
user_id: Mapped[int] = mapped_column(BigInteger, nullable=False, unique=True, index=True)
user_login: Mapped[str] = mapped_column(String(255), nullable=False, default="")
user_name: Mapped[str] = mapped_column(String(255), nullable=False, default="")
user_surname: Mapped[str] = mapped_column(String(255), nullable=False, default="")
user_fullname: Mapped[str] = mapped_column(String(511), nullable=False, default="")
user_unix: Mapped[int] = mapped_column(Integer, nullable=False, default=get_unix)
# Users
class Usersx(Databasex[ModelBase]):
ModelBase = UserModel
BaseModel = UserModel
# Репозиторий пользователей
class UsersRepository(BaseRepository[UserModel]):
def __init__(self):
super().__init__()
self.table_model = ModelBase
self.storage_name = self.table_model.model_json_schema()['storage_name']
self.column_one = False
self.table_model = UserModel
self.storage_name = UserModel.__tablename__
# Add entry
def add(
# Для совместимости add ведет себя как upsert
async def add(
self,
user_id: int,
user_login: str,
user_name: str,
user_surname: str,
user_fullname: str,
):
user_unix = get_unix()
) -> UserModel:
return await self.upsert(
user_id=user_id,
user_login=user_login,
user_name=user_name,
user_surname=user_surname,
user_fullname=user_fullname,
)
with sqlite3.connect(PATH_DATABASE) as con:
con.row_factory = dict_factory
# Создание пользователя или обновление его данных по user_id
async def upsert(
self,
user_id: int,
user_login: str,
user_name: str,
user_surname: str,
user_fullname: str,
) -> UserModel:
statement = insert(UserModel).values(
user_id=user_id,
user_login=user_login,
user_name=user_name,
user_surname=user_surname,
user_fullname=user_fullname,
user_unix=get_unix(),
)
statement = statement.on_conflict_do_update(
index_elements=[UserModel.user_id],
set_={
"user_login": statement.excluded.user_login,
"user_name": statement.excluded.user_name,
"user_surname": statement.excluded.user_surname,
"user_fullname": statement.excluded.user_fullname,
},
where=or_(
UserModel.user_login != statement.excluded.user_login,
UserModel.user_name != statement.excluded.user_name,
UserModel.user_surname != statement.excluded.user_surname,
UserModel.user_fullname != statement.excluded.user_fullname,
),
)
con.execute(
ded(f"""
INSERT INTO {self.storage_name} (
user_id,
user_login,
user_name,
user_surname,
user_fullname,
user_unix
) VALUES (?, ?, ?, ?, ?, ?)
"""),
[
user_id,
user_login,
user_name,
user_surname,
user_fullname,
user_unix,
],
async with session_scope() as session:
await session.execute(statement)
user = await self.get(user_id=user_id)
if user is None:
raise RuntimeError("Пользователь не сохранился")
return user
# Обновление пользователя по Telegram ID
async def update(self, user_id: int, **kwargs) -> None:
if not kwargs:
return
async with session_scope() as session:
await session.execute(
sqlalchemy_update(UserModel)
.where(UserModel.user_id == user_id)
.values(**kwargs)
)
# Edit entry
def update(self, user_id: int, **kwargs):
with sqlite3.connect(PATH_DATABASE) as con:
con.row_factory = dict_factory
sql = f"UPDATE {self.storage_name} SET"
sql, parameters = update_format(sql, kwargs)
parameters.append(user_id)
con.execute(sql + "WHERE user_id = ?", parameters)