Как увеличить счетчик в SQLAlchemy

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

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

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

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

Но как я выражаю count=count+1 в SQLAlchemy?

33
задан vinzee 10 September 2019 в 15:05
поделиться

2 ответа

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

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 (и, скорее всего, возникнут условия гонки). Поэтому всегда включайте столбец, как показано в двух примерах выше, в такие запросы к счетчику.

54
ответ дан 27 November 2019 в 17:47
поделиться

Если вы используете уровень 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 достаточно умна, чтобы также обновлять счетчик атрибут самого объекта, если он находится в сеансе.

30
ответ дан 27 November 2019 в 17:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: