我正在使用sqlalchemy。问题很简单,但我有一个很大的问题,因为我想使用MapperExtension。
我有两个类:用户和问题
用户可能有很多问题,并且还包含question_count 记录属于他的问题数。
所以,当我添加一个新问题时,我想要更新的question_count 用户。起初,我这样做:
question = Question(title='aaa', content='bbb')
Session.add(question)
Session.flush()
user = question.user
### user is not None
user.question_count += 1
Session.commit()
一切顺利。
但是我不想使用事件回调来做同样的事情,所以我使用了sqlalchemy的MapperExtension
。我将updating user.question_count
的逻辑放在after_insert
的{{1}}回调中。但我发现我无法更新question
,它将被忽略。
我不知道原因。而且,如果您有相同的要求,您如何实施它?
答案 0 :(得分:1)
在执行映射器扩展之前计算工作单元,因此在第一次提交事务后,对用户对象的更改将保持挂起状态。我建议您不要使用ORM来更新question_count,而是直接执行SQL语句(使用User.__table__.update(...)
生成语句)。
还有一个常见的习惯用法以原子方式增加列:table.update(...).values(col=table.c.col+1)
,它被翻译为UPDATE ... SET col=col+1
,而你的代码只是设置了新的值而失去了可能的中间增量。