Nik*_*s R 6 python sqlalchemy event-listener flask flask-sqlalchemy
我正在尝试将事件侦听器添加到before_commit
Flask应用程序内的SQLAlchemy会话事件中.在执行以下操作时
def before_commit(session):
for item in session:
if hasattr(item, 'on_save'):
item.on_save(session)
event.listen(db.session, 'before_commit', before_commit)
Run Code Online (Sandbox Code Playgroud)
我明白了
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "app.py", line 60, in <module>
event.listen(db.session, 'before_commit', before_commit)
File "C:\Python27\lib\site-packages\sqlalchemy\event\api.py", line 49, in listen
_event_key(target, identifier, fn).listen(*args, **kw)
File "C:\Python27\lib\site-packages\sqlalchemy\event\api.py", line 22, in _event_key
tgt = evt_cls._accept_with(target)
File "C:\Python27\lib\site-packages\sqlalchemy\orm\events.py", line 1142, in _accept_with
"Session event listen on a scoped_session "
sqlalchemy.exc.ArgumentError: Session event listen on a scoped_session requires that its creation callable is associated with the Session class.
Run Code Online (Sandbox Code Playgroud)
我找不到注册事件监听器的正确方法.文档实际上声明event.listen()
也接受了scoped_session
,但似乎它没有?!
http://docs.sqlalchemy.org/en/latest/orm/events.html#sqlalchemy.orm.events.SessionEvents
listen()函数将接受Session对象以及sessionmaker()和scoped_session()的返回结果.
此外,它接受Session类,该类将全局应用侦听器到所有Session实例.
这意味着您传递给 scoped_session() 的工厂必须是 sessionmaker():
from sqlalchemy.orm import scoped_session, sessionmaker, sessionmaker
from sqlalchemy import event
# good
ss1 = scoped_session(sessionmaker())
@event.listens_for(ss1, "before_flush")
def evt(*arg, **kw):
pass
# bad
ss2 = scoped_session(lambda: Session)
@event.listens_for(ss2, "before_flush")
def evt(*arg, **kw):
pass
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2323 次 |
最近记录: |