Thanks Mike
Unfortunately it seems that after_transaction_end event executes twice: right before COMMIT and after after_commit event. Here what I see with echo=True and some prints:
2016-03-29 07:29:14,799 INFO sqlalchemy.engine.base.Engine INSERT INTO users (id) VALUES (?)
2016-03-29 07:29:14,799 INFO sqlalchemy.engine.base.Engine (3,)
after_transaction_end
2016-03-29 07:29:14,799 INFO sqlalchemy.engine.base.Engine COMMIT
after_commit
after_transaction_end
2016-03-29 07:29:14,800 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2016-03-29 07:29:14,800 INFO sqlalchemy.engine.base.Engine INSERT INTO users (id) VALUES (?)
2016-03-29 07:29:14,800 INFO sqlalchemy.engine.base.Engine (2,)
after_transaction_end
2016-03-29 07:29:14,801 INFO sqlalchemy.engine.base.Engine COMMIT
after_commit
after_transaction_end
Consequently the event in after_commit never executes since token is already set. Here is the complete code:
from sqlalchemy import Column, Integer, create_engine, event
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
engine = create_engine('sqlite:///:memory:', echo=True)
Session = sessionmaker(bind=engine)
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
Base.metadata.create_all(engine)
sess = Session()
sess.add(User(id=1))
sess.commit()