Когда мне нужно вызвать flush () в SQLAlchemy?

Я новичок в SQLAlchemy и унаследовал несколько грязную базу кода без доступа к оригинальному автору.

В коде написаны призывы к DBSession.flush() , казалось бы, в любое время, когда автор хотел убедиться, что данные были сохранены. Сначала я просто следил за шаблонами, которые я видел в этом коде, но поскольку я читаю документы, кажется, что это не нужно – чтобы автозапуск был на месте. Кроме того, я получил несколько случаев с вызовами AJAX, которые генерируют ошибку «InvalidRequestError: Session уже смывается».

По каким сценариям я бы законно хотел, чтобы вы звонили на флеш ()?

Это приложение Pyramid, и SQLAlchemy настраивается с помощью:

 DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension(), expire_on_commit=False)) Base = declarative_base() 

  • Создание базы данных с помощью SQLAlchemy in Flask
  • SQLAlchemy JSON как blob / text
  • Использование Flask-SQLAlchemy в моделях Blueprint без ссылки на приложение
  • SQLAlchemy: как фильтровать типы столбцов PgArray?
  • В чем разница между фильтром и filter_by в SQLAlchemy?
  • Python / SQL Alchemy Migrate - «ValueError: слишком много значений для распаковки» при переносе изменений в db
  • Могут ли события SQLAlchemy использоваться для обновления денормализованного кэша данных?
  • Python прописывает в sqlalchemy
  • One Solution collect form web for “Когда мне нужно вызвать flush () в SQLAlchemy?”

    ZopeTransactionExtension на DBSession в сочетании с pyramid_tm в вашем проекте будет обрабатывать все коммиты для вас. Ситуации, в которых вам нужно выполнить флеш, являются:

    • Вы хотите создать новый объект и вернуть первичный ключ.

       DBSession.add(obj) DBSession.flush() log.info('look, my new object got primary key %d', obj.id) 
    • Вы хотите попытаться выполнить некоторый SQL в точке сохранения и откате, если он завершится с ошибкой без аннулирования всей транзакции.

       sp = transaction.savepoint() try: foo = Foo() foo.id = 5 DBSession.add(foo) DBSession.flush() except IntegrityError: log.error('something already has id 5!!') sp.rollback() 

    Во всех других случаях, связанных с ORM, транзакция будет прервана для вас по pyramid_tm исключения или автоматически pyramid_tm помощью pyramid_tm . Если вы выполняете необработанный SQL, вам нужно будет выполнить transaction.commit() самостоятельно или пометить сеанс как грязный через zope.sqlalchemy.mark_changed(DBSession) иначе ZTE не zope.sqlalchemy.mark_changed(DBSession) узнать, что сеанс изменился.

    Также вы должны оставить expire_on_commit по умолчанию True если у вас нет действительно веской причины.

    Python - лучший язык программирования в мире.