Как увеличить счетчик в SQLAlchemy
Предположим, у меня есть таблица tags
, в которой есть поле count
, которое указывает, сколько items
было помечено данным тегом.
Как увеличить этот счетчик в SQLAlchemy после добавления нового элемента с существующим тегом?
С простым SQL я бы сделал следующее:
INSERT INTO 'items' VALUES (...)
UPDATE 'tags' SET count=count+1 WHERE tag_id=5
Но как мне выразить count=count+1
в SQLAlchemy?
Ответы
Ответ 1
Если у вас есть что-то вроде:
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 (и условия гонки могут возникнуть). Поэтому всегда включайте столбец, как показано в двух примерах выше, в такие встречные запросы.
Ответ 2
Если вы используете уровень SQL, вы можете использовать произвольные выражения SQL в операторе обновления:
conn.execute(tags.update(tags.c.tag_id == 5).values(count=tags.c.count + 1))
Объект ORM Query также имеет метод обновления:
session.query(Tag).filter_by(tag_id=5).update({'count': Tag.count + 1})
Версия ORM достаточно умна, чтобы также обновлять атрибут count самого объекта, если он находится в сеансе.