Как можно избежать DatabaseSessionIsOver от внешних вызовов
У меня есть некоторые определения моделей, где я переопределил их __repr__
методы. Так, например, давайте учтем следующие сущности:
def A(db.Entity):
id = PrimaryKey(int, auto=True)
name = Required(unicode)
b = Optional("B")
def __repr__(self):
return self.name
def B(db.Entity):
id = PrimaryKey(int, auto=True)
name = Required(unicode)
a = Required("A")
def __repr__(self):
return '{n} from a={aname}'.format(n=self.name, aname = self.a)
Это поднимает DatabaseSessionIsOver
исключение, пока я использовал search(B, 'aaaa
) метод из Flask-PonyWhoosh, даже если он использует db_session
завернутый внутрь:
@orm.db_session
def search(model, *arg, **kw):
return model._wh_.search(*arg, **kw)
Исключение возникает только тогда, когда какой-либо объект переопределяет __repr__
метод таким образом, что я сделал в примере выше.
Тем не менее, я использую, чтобы избежать проблемы следующие предложения:
with db_session:
print(search(A, 'karl'))
Итак, вкратце, вопрос в том, есть ли способ избежать использования with ...
возможно, модифицируя __repr__
метод или, возможно, изменение методов из пакета?
Спасибо,
PD: Я читал метод предварительной выборки, но он не подходит. Я не уверен.
1 ответ
Исключение DatabaseSessionIsOver
происходит потому, что в вашем repr
метод, который вы пытаетесь получить доступ к атрибуту отношения, который не был загружен из базы данных (self.a
который пытается вернуть name
атрибут A
юридическое лицо).
Один из способов избежать этого исключения - загрузить все необходимые объекты, прежде чем покинуть db_session
, В этом случае эти объекты будут размещены на карте идентичности, и запрос к базе данных не потребуется.
Другой способ - обернуть весь ваш код большей областью db_session
поэтому, когда вы получаете доступ к атрибуту, который не был загружен из базы данных, Pony может сделать это в db_session
,
Пони требует использования @db_session
потому что он устанавливает границы для диалога базы данных и позволяет освободить ресурсы:
- Очистить кеш Identity Map
- Вернуть соединение с базой данных в пул соединений
Если мы не очистим кеш, то все объекты, которые были загружены из базы данных, будут храниться в памяти до тех пор, пока вы не очистите кеш вручную или ваша программа не завершится.
Допустим, мы вводим режим, когда db_session
никогда не заканчивается, и вам нужно очистить кэш вручную. Как вы думаете, это решит вашу проблему, и вы бы ее использовали?