Sqlalchemy 当用户发布问题时,如何更新user.question\u计数?

Sqlalchemy 当用户发布问题时,如何更新user.question\u计数?,sqlalchemy,Sqlalchemy,我在用炼金术。问题很简单,但我有一个大问题,因为我想使用MapperExtension 我有两个类:用户和问题 一个用户可能有许多问题,并且它还包含一个问题计数 记录属于他的问题的数量 所以,当我添加一个新问题时,我想更新 用户。首先,我要做的是: question = Question(title='aaa', content='bbb') Session.add(question) Session.flush() user = question.user ### user is

我在用炼金术。问题很简单,但我有一个大问题,因为我想使用MapperExtension

我有两个类:用户和问题

一个用户可能有许多问题,并且它还包含一个问题计数 记录属于他的问题的数量

所以,当我添加一个新问题时,我想更新 用户。首先,我要做的是:

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
。我把
更新user.question\u count
的逻辑放在
回调之后的
中。但是我发现我无法更新
用户。问题\u count
,它将被忽略


我不知道原因。而且,如果您有相同的需求,如何实现它?

工作单元是在执行映射器扩展之前计算的,因此在首次提交事务后,对用户对象的更改将保持挂起状态。我建议您不要使用ORM来更新问题计数,而是直接执行SQL语句(使用
User.\u\u table\u.update(…)
来生成语句)


还有一个常用的习惯用法是以原子方式递增列:
table.update(…).values(col=table.c.col+1)
,它被转换为
update。。。设置col=col+1
,而您的代码只是设置新的值,可能会丢失中间增量。

实际上ORM可以在这里工作,但您需要重新定义
Session.flush()
以刷新两次(或更多,取决于您的需要)。但是我相信这不是解决你问题的最好办法。