Как увеличить счетчик в SQLAlchemy - PullRequest
29 голосов
/ 25 февраля 2010

Предположим, у меня есть таблица tags, в которой есть поле count, указывающее, сколько items было помечено данным тегом.

Как увеличить этот счетчик в SQLAlchemy после добавления нового элемента с существующим тегом?

С простым SQL я бы сделал следующее:

INSERT INTO `items` VALUES (...)
UPDATE `tags` SET count=count+1 WHERE tag_id=5

Но как мне выразить count=count+1 в SQLAlchemy?

Спасибо, Бода Чидо.

Ответы [ 2 ]

48 голосов
/ 25 февраля 2010

Если у вас есть что-то вроде:

mytable = Table('mytable', db.metadata,
    Column('id', db.Integer, primary_key=True),
    Column('counter', db.Integer)
)

Вы можете увеличивать поля следующим образом:

m = mytable.query.first()
m.counter = mytable.c.counter + 1

Или, если у вас есть некоторые сопоставленные модели, вы можете написать альтернативно:

m = Model.query.first()
m.counter = Model.counter + 1

Обе версии вернут запрос SQL, который вы просили. Но если вы не включите столбец и просто напишите m.counter += 1, тогда новое значение будет вычислено в Python (и условия гонки могут возникнуть) Поэтому всегда включайте столбец, как показано в двух примерах выше, в такие встречные запросы.

С уважением,
Christoph

28 голосов
/ 26 февраля 2010

Если вы используете слой SQL, то вы можете использовать произвольные выражения SQL в операторе обновления:

conn.execute(tags.update(tags.c.tag_id == 5).values(count=tags.c.count + 1))

Объект запроса ORM также имеет метод обновления:

session.query(Tag).filter_by(tag_id=5).update({'count': Tag.count + 1})

Версия ORM достаточно умна, чтобы также обновлять атрибут count для самого объекта, если он находится в сеансе.

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