Похожие чаты

Всем привет, не пойму один момент с асинхронной алхимией. Когда

у меня есть связь Many To One между моделями и я пытаюсь обратиться к списку связанных обьектов, то есть к type_writer_infos в модели PortfolioInfo, то получаю ошибку.

class PortfolioInfo(Base):
__tablename__ = 'portfolio_info'

id: Mapped[uuid.uuid4] = mapped_column(UUID(as_uuid=True),
primary_key=True,
default=uuid.uuid4)
owner_name: Mapped[str] = mapped_column(String(40),
nullable=False)
type_writer_infos: Mapped[list['TypeWriterInfo']] = relationship(back_populates='portfolio_info')



class TypeWriterInfo(Base):
__tablename__ = 'type_writer_info'

id: Mapped[uuid.uuid4] = mapped_column(UUID(as_uuid=True),
primary_key=True,
default=uuid.uuid4)
info: Mapped[str] = mapped_column(String(150),
nullable=False)
portfolio_info_id: Mapped[uuid.uuid4] = mapped_column(ForeignKey('portfolio_info.id'))
portfolio_info: Mapped['PortfolioInfo'] = relationship(back_populates='type_writer_infos')

def __repr__(self):
return f'Info: {self.info}'


вот модели.

Вот пример

async def create_portfolio_info(self):
info = PortfolioInfo(
owner_name='Oleg Kuzmenko'
)
async with self.session.begin():
self.session.add(info)
lst = info.type_writer_infos
await self.session.commit()
print(lst)
return info

здесь всё ок, я внутри транзакции забираю список связанных обьектов и когда делаю принт ошибок нету, выдает список.

Но, если

async def create_portfolio_info(self):
info = PortfolioInfo(
owner_name='Oleg Kuzmenko'
)
async with self.session.begin():
self.session.add(info)
await self.session.commit()
lst = info.type_writer_infos
print(lst)
return info

я выношу это за пределы транзакции, то мне выдает

sqlalchemy.exc.MissingGreenlet: greenlet_spawn has not been called and asyncio event loop is already running; can't call await_fallback() here. Was IO attempted in an unexpected place? (Background on this error at: https://sqlalche.me/e/20/xd2s)

я и lazy='selectin' прописывал но не помогло. Вопрос, мне получается чтобы получать связанные обьекты, нужно всегда получать их внутри транзакции?

3 ответов

12 просмотров

А почему не дословно из доки? https://docs.sqlalchemy.org/en/20/orm/extensions/asyncio.html#preventing-implicit-io-when-using-asyncsession stmt = select(A).options(selectinload(A.bs))

Ты отключал expire_on_commit?

Oleg-Kuzmenko Автор вопроса

async def create_portfolio_info(self): info = PortfolioInfo( owner_name='Oleg Kuzmenko' ) async with self.session.begin(): self.session.add(info) await self.session.commit() await self.session.refresh(info, attribute_names=['type_writer_infos']) print(info.type_writer_infos) return info решил это с помощью session.refresh, но не знаю, мне кажется это не самый лучший варинат как это можно было сделать

Похожие вопросы

Обсуждают сегодня

А кто-то пробовал, уезжая из Эстонии получить э-рез и продолжить вести предпринимательскую деятельность внутри Эстонии, используя свой OÜ?
Lalalashechki Lalala
62
@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
@samkazemian - couple questions: Update on frxBTC? - This would do well with the current influx of institutional investment entering the space Update on future veFXS streams...
Costi
16
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
Does anyone here have a connection Mullvad? it would be nice to know what it would take to have them accept BCH 0-conf.
tl121x
16
Подобного рода ;Следующие три строки это директивы ассемблера, ;которые можно не задавать, т.к.работаем в Visual Studio. ;Символ ";" - это начало однострочного комментария ...
Егор Анелькин
3
Can an XMR transaction be tracked from its sender to its receiver by performing blockchain analysis, no matter how many addresses are used?
Trkz342
16
Кто-нибудь знает почему SPM клонирует репо целиком? Некоторые репы просто огромные, как та же swift-syntax которая нужна для использования макросов. Сначала подумал, что это...
iMike
6
I arrived here after a Chico Crypto show highlighted the project & the Team - the fact that the Team had a long history of successfully working with household names gave me e...
Banter is Bullish
5
Карта сайта