column_property работает довольно плохо в сочетании с datetime.now()

#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() , чтобы получить временную метку текущей транзакции, а затем использовать ее для сравнения. Таким образом, подделка / исправление даже не требуется.