from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.future import select from sqlalchemy.exc import IntegrityError from model.database import Client async def upsert_client(db: AsyncSession, user_id: str, user_login: str, user_nicename: str, user_email: str, phone: str, json_data: str): # Проверяем, существует ли клиент с таким логином или email async with db.begin(): result = await db.execute( select(Client).filter((Client.id == user_id))# | (Client.user_email == user_email)) ) client = result.scalars().first() # Получаем первый результат или None if client: # Если клиент существует, обновляем его данные client.user_nicename = user_nicename client.phone = phone client.json_data = json_data # Можно добавить другие поля для обновления try: await db.commit() # Применяем изменения в базе данных await db.refresh(client) # Обновляем объект в Python return client except IntegrityError: await db.rollback() # В случае ошибки откатываем изменения raise else: # Если клиента нет, создаем нового new_client = Client( user_login=user_login, user_nicename=user_nicename, user_email=user_email, json_data=json_data, ) db.add(new_client) try: await db.commit() # Сохраняем нового клиента в базе данных await db.refresh(new_client) # Обновляем объект в Python return new_client except IntegrityError: await db.rollback() # В случае ошибки откатываем изменения raise