sqlalchemy事件监听

看了这篇文章https://www.cnblogs.com/xiaxiaoxu/p/10703391.html
学着做了事件监听,
一个action引用一个rule_id,
在表action设置db_rule_id时,更新rule表的被引用次数action_count字段

结果报错

 

 原来是因为原来没有选中任何db_rule_id时,value并不是none,而是symbol('NO_VALUE')或者symbol('NEVER_SET')

可以参考官网说的https://www.osgeo.cn/sqlalchemy/orm/events.html?highlight=no_value

from sqlalchemy import event


@event.listens_for(SomeClass.some_attribute, 'set')
def receive_set(target, value, oldvalue, initiator):
    "listen for the 'set' event"

    # ... (event handling logic) ...
参数
  • target -- 接收事件的对象实例。如果侦听器注册在 raw=True ,这将是 InstanceState 对象。

  • value -- 正在设置的值。如果此侦听器注册到 retval=True ,Listener函数必须返回该值,或替换该值的新值。

  • oldvalue -- 正在替换上一个值。这也可能是符号 NEVER_SET 或 NO_VALUE . 如果侦听器注册在 active_history=True ,如果现有值当前已卸载或过期,则将从数据库加载该属性的上一个值。

  • initiator -- 的实例 Event 表示事件的开始。可以由backref处理程序从其原始值进行修改,以控制链接的事件传播。…版本更改::0.9.0 initiator 参数现在作为 Event 对象,并且可以由backref链接事件链中的backref处理程序修改。

返回

如果事件注册在 retval=True 应返回给定值或新的有效值。

参见

AttributeEvents -侦听器选项的背景,如到子类的传播。

参考https://www.pythonheidong.com/blog/article/144731/560531fda754a9a05f1b/

因此修改代码为,

from sqlalchemy.util.langhelpers import symbol
……
@event.listens_for(action.db_rule_id, 'set') def set_action_count(target, value, old_value, initiator): if old_value != symbol('NEVER_SET') and old_value != symbol('NO_VALUE'): ……

 



posted @ 2021-01-19 11:45  ata0083  阅读(533)  评论(0)    收藏  举报