Как обновить user.question_count, когда пользователь разместил вопрос? - PullRequest
2 голосов
/ 05 сентября 2010

Я использую sqlalchemy. Вопрос прост, но у меня большая проблема, потому что я хочу использовать MapperExtension.

У меня есть два класса: Пользователь и Вопрос

У пользователя может быть много вопросов, и он также содержит 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() 

Все идет хорошо.

Но я не хочу использовать функцию обратного вызова события, чтобы сделать то же самое, поэтому я использую MapperExtension sqlalchemy. Я поместил логику updating user.question_count в after_insert обратный вызов question. Но я обнаружил, что не могу обновить user.question_count, он будет проигнорирован.

Я не знаю причину. И, если у вас есть такое же требование, как вы его выполняете?

1 Ответ

1 голос
/ 06 сентября 2010

Единица работы вычисляется до выполнения расширения картографа, поэтому ваши изменения в пользовательском объекте остаются в ожидании после того, как транзакция будет зафиксирована в первый раз.Я предлагаю вам не использовать ORM для обновления question_count, но выполнять оператор SQL напрямую (используйте User.__table__.update(...) для генерации оператора).

Также существует общая идиома для столбца атомарного приращения: table.update(...).values(col=table.c.col+1), который переводится в UPDATE ... SET col=col+1, в то время как ваш код просто устанавливает новое значение, теряя возможные промежуточные приращения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...