我希望通知每當一個模型被保存,然後做一些處理並保存另一個模型。我需要模型在處理階段已經有數據庫設置的ID。如何用Flask-SQLAlchemy做一個類似post_save的Django信號?
使用Django一個會覆蓋像模型或使用信號的.save()
方法:
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import MyModel, OtherModel
@receiver(post_save, sender=MyModel)
def do_stuff(sender, instance, created, **kwargs):
assert instance.id is not None
...
OtherModel.create(related=instance, data=...)
如何做SQLAlchemy
和Flask
相似?我擡頭看ORM Events,似乎expire
IntanceEvent將符合該法案。這似乎火每當模型實例被保存,但是當我嘗試做同樣的事:
from sqlalchemy import event
from . import db
from .models import MyModel, OtherModel
@event.listens_for(MyModel, "expire")
def do_stuff(target, attrs):
assert target.id is not None
...
db.session.add(OtherModel(related=target, data=...))
db.session.commit()
它無法在assert instance.id is not None
有:
InvalidRequestError: This session is in 'committed' state; no further SQL can be emitted within this transaction.
這可能是我只是接近這個錯誤的方式,或者我錯過了一些至關重要的事情,但我無法弄清楚。該文檔分爲Flask
,Flask-SQLAlchemy
和SQLAlchemy
,我很難拼湊在一起。
我應該如何使這種後保存觸發器SQLAlchemy
?