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.0initiator
参数现在作为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'):
……