SQLAlchemy Обновление модели ORM после ее вставкиPython

Программы на Python
Ответить
Anonymous
 SQLAlchemy Обновление модели ORM после ее вставки

Сообщение Anonymous »

Код: Выделить всё

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
Я создал следующую функцию для добавления записей в базу данных sqlite. После того как запись добавлена ​​и зафиксирована, я использую функцию get_record, которая использует selectinload для загрузки связанного объекта User

Код: Выделить всё

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()
Как видите, я также объявил специальную функцию to_dict внутри базового класса, которая преобразует модель в словарь для использования внутри функцииvalues(). Стоит отметить, что функция to_dict не включает ключи со значениями None (чтобы не вызывать проблем со столбцами, для которых установлено значение по умолчанию).
Кажется, все работает, но я бы хотел знаете, есть ли лучший способ выполнить все эти действия? Первоначально я использовал session.add, но, к сожалению, он не обрабатывает конфликты.
А также можно ли использовать модели ORM вне сеансов sqlalchemy? Насколько мне известно, лучшим подходом является создание специального класса данных (с использованием встроенных классов данных или pydantic) и преобразование их в модель orm и наоборот. Это необходимый шаг или его можно пропустить?

Подробнее здесь: https://stackoverflow.com/questions/792 ... serting-it
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»