Sqlalchemy 当用户发布问题时,如何更新user.question\u计数?
我在用炼金术。问题很简单,但我有一个大问题,因为我想使用MapperExtension 我有两个类:用户和问题 一个用户可能有许多问题,并且它还包含一个问题计数 记录属于他的问题的数量 所以,当我添加一个新问题时,我想更新 用户。首先,我要做的是:Sqlalchemy 当用户发布问题时,如何更新user.question\u计数?,sqlalchemy,Sqlalchemy,我在用炼金术。问题很简单,但我有一个大问题,因为我想使用MapperExtension 我有两个类:用户和问题 一个用户可能有许多问题,并且它还包含一个问题计数 记录属于他的问题的数量 所以,当我添加一个新问题时,我想更新 用户。首先,我要做的是: question = Question(title='aaa', content='bbb') Session.add(question) Session.flush() user = question.user ### user is
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()
以刷新两次(或更多,取决于您的需要)。但是我相信这不是解决你问题的最好办法。