我有表A和表B,我想在表A事件中添加/更新/删除表B中的列。我尝试了以下内容:
文档说明
映射器级刷新事件旨在对正在处理的直接对象的本地属性进行操作,并且仅通过给定连接的SQL操作进行操作...映射器事件中不支持的操作包括:Session.add()Session。 delete()...映射关系属性集/ del事件
这限制了我可以对其他表做的任何事情。例如,
def after_insert_listener(mapper, connection, target):
target.value = "New Value"
完美无缺
def after_insert_listener(mapper, connection, target):
target.child.count += 1
没有做到这一点。放db.session.commit()会给我这个错误
ResourceClosedError:此事务已关闭
我尝试使用SessionEvents.before_flush(),但它既不能附加到特定模型也不能理解如何使用它。
我尝试使用models_committed信号:
@models_committed.connect_via(app)
def on_models_committed(sender, changes):
for obj, change in changes:
if change == 'delete' and hasattr(obj, '__after_delete__'):
obj.__after_delete__()
elif change == 'update' and hasattr(obj, '__after_update__'):
obj.__after_update__()
elif change == 'insert' and hasattr(obj, '__after_insert__'):
obj.__after_insert__()
class TableA(db.Model):
def __after_insert__(self):
self.child.count += 1
self.value = "New Value"
db.session.commit()
这给了我
InvalidRequestError:此会话处于“已提交”状态;此事务中不能再发出SQL。
如何在插入另一个模型后更新模型的实例?
答案 0 :(得分:1)
你可以试试这个,
@event.listens_for(B, "after_insert")
def after_insert_listener(mapper, connection, target):
A_table = A.__table__
connection.execute(
A_table.update().
where(A_table.id==target.a_table.id). # Do Foreign key join porperly
values(value='New Value')
)