#python #sqlalchemy
#python #sqlalchemy
Вопрос:
Я пытаюсь использовать column_property
из SQLAlchemy, чтобы мои атрибуты загружались во время запроса (чтобы иметь 1 запрос, а не n 1).
Код выглядит так:
class Whatever(db.Model):
from datetime import datetime as dt
prio_event = column_property(func.synthetise_events_with_date(id, dt.now()), deferred=True)
Код в основном работает, но во время тестов я сталкиваюсь с некоторыми проблемами: каким-то образом SQLAlchemy кэширует результат dt.now().
Учитывая следующий запрос:
q = Whatever.query.filter(whatever).options(undefer(Job.prio_event))
Если вы вызовете это в time t
и в time t 20 sec
, запрос будет иметь те же вторые параметры (дата будет t
в обоих случаях).
Вопрос в том, есть ли более элегантное решение, чем выполнение базового соединения вместо свойства столбца (которое будет работать, потому что параметры будут вычисляться во время выполнения)? Гибридное свойство, похоже, не подходит, потому что вы не можете загрузить его во время запроса.
Комментарии:
1. Можно предположить, что свойство cokumn_property «материализуется» при первом использовании и поэтому «замораживает» значения Python. Вы пробовали использовать
func.now()
вместоdt.now()
? Или вы обязаны использоватьdt.now()
?2.
func.now()
будет работать, но не с модульным тестом: Я подделываю datetime для целей тестирования3. В рамках одной транзакции все вызовы
NOW()
(а такжеCURRENT_TIMESTAMP
amp; co) всегда будут возвращать одно и то же время. Возможно, это поможет вам с модульными тестами. Вы можете запустить простойSELECT NOW()
, чтобы получить временную метку текущей транзакции, а затем использовать ее для сравнения. Таким образом, подделка / исправление даже не требуется.