Как отмечено в комментариях @SuperShoot, запрос на вставку может вычислить неиспользуемую емкость в базе данных без предварительной выборки.Явный конструктор, такой как показанный @tooTired, может передать скалярный подзапрос как unusedCapacity
:
class Event(db.Model):
...
def __init__(self, **kwgs):
if 'unusedCapacity' not in kwgs:
kwgs['unusedCapacity'] = \
db.select([Room.capacity - kwgs['attendance']]).\
where(Room.id == kwgs['room_id']).\
as_scalar()
super().__init__(**kwgs)
Хотя можно использовать клиентские выражения SQL в качестве значений по умолчанию,Я не уверен, как можно ссылаться на значения, которые будут вставлены в выражение, без использования контекстной функции по умолчанию , но это не совсем сработало: скалярный подзапрос не был встроенным, и SQLAlchemy пыталсявместо того, чтобы передавать его, используя заполнители.
Недостатком подхода __init__
является то, что вы не можете выполнять массовые вставки, которые бы обрабатывали неиспользованную емкость, используя таблицу, созданную для модели, как есть, но придется выполнять вручнуюзапрос, который делает то же самое.
Еще одна вещь, на которую следует обратить внимание, заключается в том, что до тех пор, пока не произойдет очистка, атрибут unusedCapacity
нового объекта Event
содержит объект выражения SQL, а не фактическое значение.Решение @tooTired более прозрачно в этом отношении, поскольку новый объект Event
будет содержать числовое значение неиспользованной емкости с самого начала.