Код: Выделить всё
async def upsert_record(record: Record) -> Record:
async with async_session() as session:
stmt = insert(Record).values(
record.to_dict()
).on_conflict_do_update(
index_elements=['id'],
set_={
# Just updating the values, nothing important
...
}
)
result = await session.execute(stmt)
await session.commit()
record = await get_record(result.inserted_primary_key[0])
return record
Код: Выделить всё
async def get_record(id: int) -> Optional[Record]:
async with async_session() as session:
result = await session.execute(
select(Record)
.where(Record.id == id)
.options(
selectinload(Record.user),
)
)
return result.scalars().one_or_none()
Кажется, все работает, но я бы хотел знаете, есть ли лучший способ выполнить все эти действия? Первоначально я использовал session.add, но, к сожалению, он не обрабатывает конфликты.
А также можно ли использовать модели ORM вне сеансов sqlalchemy? Насколько мне известно, лучшим подходом является создание специального класса данных (с использованием встроенных классов данных или pydantic) и преобразование их в модель orm и наоборот. Это необходимый шаг или его можно пропустить?
Подробнее здесь: https://stackoverflow.com/questions/792 ... serting-it
Мобильная версия