Подтвердить что ты не робот

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

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

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

В каких сценариях я бы законным образом хотел бы позвонить, чтобы сбросить()?

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

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

Ответ 1

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. Если вы выполняете необработанный SQL, вам нужно будет выполнить transaction.commit() самостоятельно или пометить сеанс как грязный через zope.sqlalchemy.mark_changed(DBSession), иначе ZTE не сможет узнать, что сеанс изменился.

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