Как в Python из базы данных sqlalchemy (orm) выбрать нужное поле нужного клиента?
Я новичёк в Python. Поставил себе тех. задание сделать простого бота в ТГ с БД sqlalchemy (orm). Никак не могу понять как вытянуть в переменную данные конкретного поля (например limit)? чтобы с ней поработать, изменить в зависимости от обстоятельств других полей и обновить в базе.
Вот рабочий код с которым я работаю: Это создание таблицы в БД
import os
from sqlalchemy import engine, BigInteger, String, MetaData
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
from sqlalchemy.ext.asyncio import AsyncAttrs, async_sessionmaker, create_async_engine,
AsyncSession
engine = create_async_engine(os.getenv('URLDB'))
session_maker = async_sessionmaker(bind=engine, class_=AsyncSession, expire_on_commit=False)
async_session = async_sessionmaker(bind=engine, class_=AsyncSession, expire_on_commit=False)
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = 'users'
id: Mapped[int] = mapped_column(primary_key=True)
tg_id = mapped_column(BigInteger)
username: Mapped[str] = mapped_column(String(25))
date_t = mapped_column(BigInteger)
date_t2 = mapped_column(BigInteger)
limit: Mapped[int]
is_active: Mapped[bool]
async def async_main():
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
Далее код функции, которая по полю, где записан ID Телеграм, определяет существует ли пользователь с таким ID. Если существует, то нужно вытянуть содержимое поля limit. Если не существует то создать запись в таблице с нужными данными
import time
from app.database.models import session_maker
from app.database.models import User
from sqlalchemy import select, update
async def set_user(tg_id, limit):
async with session_maker() as session:
user = await session.scalar(select(User).where(User.tg_id == tg_id))
ПОЛЬЗОВАТЕЛЬ ТАКОЙ ЕСТЬ, ПОЭТОМУ НУЖНО ПОЛУЧИТЬ ЧИСЛО ИЗ ПОЛЯ limit
ЧТОБЫ ПРОДЕЛАТЬ С НИМ НЕКОТОРЫЕ ОПЕРАЦИИ, ПЕРЕДАТЬ В ДРУГУЮ ФУНКЦИЮ........
if not user:
print(tg_id)
session.add(User(tg_id=tg_id, username=username,
date_t=time.time(), date_t2=time.time()+604800, limit=4, is_active=False))
await session.commit()
Ответы (1 шт):
Перелопатив кучу информации нашел вот такой выход для реализации заданной цели. Может кому-то пригодится
Напомню, цель была получить содержимое конкретного поля из конкретного юзера. Затем это значение изменить и вернуть на место уже изменённым. Вот такой код получился:
async def find_limit(tg_id, dlt = 1):
async with session_maker() as session:
result = await session.execute(select(User.limit).where(User.tg_id == tg_id)) # вытягиваем поле limit из конкретного id
lim = (result.scalar_one_or_none()) - dlt # вычитаем 1 из полученного значения поля
cursor = update(User).where(User.tg_id == tg_id).values(limit=lim) # Заносим в конкретную запись по id конкретное поле нужное значение
await session.execute(cursor)
await session.commit()
if lim == 8:
print (f'Условие соблюдается {lim}')
else:
print(f'Условие не соблюдается {lim}')