SQLAlchemy 0.6.5 (и 0.6.8) SessionExtension after_flush не вызывается - PullRequest
1 голос
/ 25 июня 2011

Я не понимаю, но этот код не вызывает after_flush / before_flush / after_flush_postexec

# -*- coding: utf-8 -*-

from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.orm.interfaces import SessionExtension

class AfterFlushExtension(SessionExtension):
    def before_commit(self, session):
        print "> before_commit"

    def after_commit(self, session):
        print "> after_commit"

    def before_flush(self, session, flush_context, instances):
        print '> before_flush'

    def after_flush(self, session, flush_context):
        print '> after_flush'

    def after_flush_postexec(self, session, flush_context):
        print '> after_flush_postexec'

session = scoped_session(sessionmaker(extension=AfterFlushExtension()))
session.flush()
session.commit()

И результат:

$ python ~/Dropbox/playground/python/sqlalchemy_hook_test/main.py 
> before_commit
> after_commit

1 Ответ

1 голос
/ 29 июня 2011

Майкл Байер ответил в списке рассылки SQLAlchemy https://groups.google.com/d/msg/sqlalchemy/GrMZGtJ-yc8/mCviGB6g9HYJ:

События сброса активируются, только если на самом деле есть что-то очищено. Это было бы неэффективно для события для каждого события flush (), поскольку flush на самом деле называется множество раз на каждый запрос, при условии, что автозапуск включен. За это вызвать flush () с сеансом, который не имеет никаких событий изменения любого вида быстро проверяет некоторые флаги и возвращает.

Представьте, что before_flush () действительно называется before_flush_on_pending_changes () если это помогает.

Я проверю строки документов, чтобы увидеть, любое уточнение необходимо.

Спасибо, Майкл

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...