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

  1. Очистить кеш Identity Map
  2. Вернуть соединение с базой данных в пул соединений

Если мы не очистим кеш, то все объекты, которые были загружены из базы данных, будут храниться в памяти до тех пор, пока вы не очистите кеш вручную или ваша программа не завершится.

Допустим, мы вводим режим, когда db_session никогда не заканчивается, и вам нужно очистить кэш вручную. Как вы думаете, это решит вашу проблему, и вы бы ее использовали?

Другие вопросы по тегам