VORKOUT-7 #9

Merged
ivan.dev merged 12 commits from VORKOUT-7 into master 2025-06-05 16:29:14 +05:00
Showing only changes of commit 320c13183f - Show all commits

View File

@ -3,6 +3,8 @@ import math
from datetime import datetime, timezone from datetime import datetime, timezone
from pydantic import TypeAdapter
from sqlalchemy import insert, select, func from sqlalchemy import insert, select, func
from sqlalchemy.ext.asyncio import AsyncConnection from sqlalchemy.ext.asyncio import AsyncConnection
from enum import Enum from enum import Enum
@ -10,33 +12,45 @@ from enum import Enum
from api.db.tables.account import account_table from api.db.tables.account import account_table
from api.schemas.account.account import User from api.schemas.account.account import User
from api.schemas.endpoints.account import AllUser,AllUserResponse from api.schemas.endpoints.account import AllUser, AllUserResponse
ivan.dev marked this conversation as resolved Outdated

Надо переименовать метод и изменить описание, сейчас же не только login и id

Надо переименовать метод и изменить описание, сейчас же не только `login` и `id`
async def get_all_users_login_and_id(connection: AsyncConnection,page,limit) -> Optional[User]:
async def get_all_users_login_and_id(connection: AsyncConnection, page, limit) -> Optional[User]:
""" """
Получает id и login всех юзеров Получает id и login всех юзеров
""" """
first_user = page*limit-(limit-1)
last_user = first_user+(limit-1)
ivan.dev marked this conversation as resolved Outdated

Давай все-таки через offset делать, а то вычислять по id как-то сомнительно выглядит

Давай все-таки через `offset` делать, а то вычислять по `id` как-то сомнительно выглядит
query = select(account_table.c.id, account_table.c.login).where(account_table.c.id.between(first_user, last_user )) user_adapter = TypeAdapter(AllUser)
response_adapter = TypeAdapter(AllUserResponse)
ivan.dev marked this conversation as resolved Outdated
  1. Тебе нужен адаптер для list[AllUser]. В текущем виде это не имеет смысла, это равносильно простому созданию класса по кейвордам.
  2. В документации написано, что такие конструкции лучше создавать один раз, соответственно стоит их делать глобальными тогда.
1. Тебе нужен адаптер для `list[AllUser]`. В текущем виде это не имеет смысла, это равносильно простому созданию класса по кейвордам. 2. В документации написано, что такие конструкции лучше создавать один раз, соответственно стоит их делать глобальными тогда.
result = await connection.execute(query) first_user = page*limit-(limit)
users = result.fetchall() query = (
select(account_table.c.id, account_table.c.login)
user_list = [{'id': user.id, 'login': user.login} for user in users] .order_by(account_table.c.id)
ivan.dev marked this conversation as resolved Outdated

Можно вместо этого использовать parse_obj_as из pydantic.tools, чтобы парсить запрос сразу из бд в модель User
Можешь посмотреть в репозитории бэка

Можно вместо этого использовать `parse_obj_as` из `pydantic.tools`, чтобы парсить запрос сразу из бд в модель `User` Можешь посмотреть в [репозитории](https://gitea.heado.ru/dinar/backend/src/branch/master/backend/db/logic/issues.py#L93) бэка

parse_obj_as устарело в Pydantic 2, не используйте это. Для подобных целей создали TypeAdapter.

`parse_obj_as` устарело в Pydantic 2, не используйте это. Для подобных целей создали [TypeAdapter](https://docs.pydantic.dev/2.11/concepts/type_adapter/).
.offset(first_user)
user_models = [AllUser(id=user['id'], login=user['login']) for user in user_list] .limit(limit)
)
count_query = select(func.count()).select_from(account_table) count_query = select(func.count()).select_from(account_table)
result = await connection.execute(query)
count_result = await connection.execute(count_query) count_result = await connection.execute(count_query)
amount_count = count_result.scalar()
amount_pages = math.ceil(amount_count / limit)
users_data = result.fetchall()
ivan.dev marked this conversation as resolved Outdated

А почему ты только эти поля селектишь? Просто для теста взял?

А почему ты только эти поля селектишь? Просто для теста взял?

Да.

Да.
total_count = count_result.scalar()
total_pages = math.ceil(total_count / limit)
return AllUserResponse(users=user_models, amount_count=amount_count, amount_pages=amount_pages) validated_users = [
user_adapter.validate_python({"id": u.id, "login": u.login})
for u in users_data
]
return response_adapter.validate_python({
ivan.dev marked this conversation as resolved Outdated

Тут нужно вернуть обыкновенное заполнение класса и его возврат.

Тут нужно вернуть обыкновенное заполнение класса и его возврат.

Так сразу users_data можно сюда передать? На худой случай ._asdict() есть.

Так сразу `users_data` можно сюда передать? На худой случай [._asdict()](https://docs.sqlalchemy.org/en/20/core/connections.html#sqlalchemy.engine.Row._asdict) есть.
"users": validated_users,
"amount_count": total_count,
"amount_pages": total_pages
})
async def get_user_id(connection: AsyncConnection, id: int) -> Optional[User]: async def get_user_id(connection: AsyncConnection, id: int) -> Optional[User]:
@ -116,8 +130,6 @@ async def create_user(connection: AsyncConnection, user: User, creator_id: int)
status=user.status.value status=user.status.value
) )
await connection.execute(query) await connection.execute(query)
await connection.commit() await connection.commit()