Событие SqlAlchemy «before_insert» не запускается при асинхронной настройке ⇐ Python
-
Anonymous
Событие SqlAlchemy «before_insert» не запускается при асинхронной настройке
У меня есть такая настройка для класса Order:
класс Order(Base): __tablename__ = 'заказ' id = Column(pgUUID(as_uuid=True), Primary_key=True, default=uuid4, unique=True, nullable=False) user_id = Столбец (String, ForeignKey («user.id»), nullable = False) число = Столбец (Целое число, по умолчанию = 0) статус = Столбец (Enum (Состояние), nullable = False) созданный_at = Столбец (DateTime (часовой пояс = True), server_default = func.now ()) update_at = Column(DateTime(timezone=True), onupdate=func.now()) Я пытаюсь перехватить событиеbefore_insert с помощью этого кода:
@event.listens_for(Order, 'before_insert') async def before_insert (сопоставитель, соединение, цель): # Используйте сеанс, связанный с целью, убедитесь, что он синхронен async_session = AsyncSession (соединение) # Извлекаем текущий год из созданного_at или используем текущий год, если он не установлен curr_year = target.created_at.year, если target.created_at, иначе datetime.now().year # Асинхронный запрос для поиска текущего максимального числа за год результат = ожидание async_session.execute(select(func.max(Order.number)).filter(func.extract('year', Order.created_at) == curr_year)) max_number = result.scalar_one_or_none() # Устанавливаем номер текущего ордера целевой.номер = (макс_номер или 0) + 1 # Закрываем асинхронный сеанс дождитесь async_session.close() engine = create_async_engine (DATABASE_URL, будущее = True, echo = False, Pool_size = 30, max_overflow = 50) async_session = создатель сеанса (движок, expire_on_commit = False, class_ = AsyncSession) асинхронный с async_session() в качестве сеанса: асинхронно с session.begin(): new_order = Order(**kwargs) # kwargs — некоторая информация для создания ордеров session.add(новый_порядок) дождитесь сеанса.flush() Тем не менее, событие никогда не запускается. Есть ли что-то, что я делаю неправильно? Можно ли использовать события Sqlalchemy в асинхронной среде?
У меня есть такая настройка для класса Order:
класс Order(Base): __tablename__ = 'заказ' id = Column(pgUUID(as_uuid=True), Primary_key=True, default=uuid4, unique=True, nullable=False) user_id = Столбец (String, ForeignKey («user.id»), nullable = False) число = Столбец (Целое число, по умолчанию = 0) статус = Столбец (Enum (Состояние), nullable = False) созданный_at = Столбец (DateTime (часовой пояс = True), server_default = func.now ()) update_at = Column(DateTime(timezone=True), onupdate=func.now()) Я пытаюсь перехватить событиеbefore_insert с помощью этого кода:
@event.listens_for(Order, 'before_insert') async def before_insert (сопоставитель, соединение, цель): # Используйте сеанс, связанный с целью, убедитесь, что он синхронен async_session = AsyncSession (соединение) # Извлекаем текущий год из созданного_at или используем текущий год, если он не установлен curr_year = target.created_at.year, если target.created_at, иначе datetime.now().year # Асинхронный запрос для поиска текущего максимального числа за год результат = ожидание async_session.execute(select(func.max(Order.number)).filter(func.extract('year', Order.created_at) == curr_year)) max_number = result.scalar_one_or_none() # Устанавливаем номер текущего ордера целевой.номер = (макс_номер или 0) + 1 # Закрываем асинхронный сеанс дождитесь async_session.close() engine = create_async_engine (DATABASE_URL, будущее = True, echo = False, Pool_size = 30, max_overflow = 50) async_session = создатель сеанса (движок, expire_on_commit = False, class_ = AsyncSession) асинхронный с async_session() в качестве сеанса: асинхронно с session.begin(): new_order = Order(**kwargs) # kwargs — некоторая информация для создания ордеров session.add(новый_порядок) дождитесь сеанса.flush() Тем не менее, событие никогда не запускается. Есть ли что-то, что я делаю неправильно? Можно ли использовать события Sqlalchemy в асинхронной среде?
Мобильная версия