我有一些 SQL,我希望 SQLAlchemy 在刷新 current 会话后发出。
所以我试图编写一个Python函数,它将执行以下操作“在这个特定的SQLAlchemy会话结束时,1)刷新会话,2)然后将这个额外的SQL也发送到数据库,3)然后最后提交会话”,但前提是我在该特定会话中调用它。
我不希望它在全局的所有会话上,所以如果我没有在这个会话中调用该函数,那么就不要执行SQL。
我知道 SQLAlchemy 有一个内置的事件系统,我也尝试过它,但我不知道如何仅为当前会话而不是全局的所有会话注册事件侦听器。我阅读了文档,但我仍然不明白。
我知道数据库触发器,但它们不适用于此特定场景。
我正在使用 Flask-SQLAlchemy,它使用范围会话。
不知道为什么它不适合你。下面的示例代码按预期运行:
class Stuff(Base):
__tablename__ = "stuff"
id = Column(Integer, primary_key=True)
name = Column(String)
Base.metadata.create_all(engine)
session = Session()
from sqlalchemy import event
@event.listens_for(session, "after_flush")
def _handle_event(session, context):
print(">> --- after_flush started ---")
rows = session.execute("SELECT 1 AS XXX").fetchall()
print(rows)
print(">> --- after_flush finished ---")
# create test data
s1 = Stuff(name="uno")
session.add(s1)
print("--- before calling commit ---")
session.commit()
print("--- after calling commit ---")