Как «восстановить» объект ORM или список таких объектов с базой данных? - PullRequest
0 голосов
/ 01 января 2019

Насколько я понимаю, следующий код вернет ошибку:

from src.mysqlClient import db_session
from src.mysqlClient.models import AdvertDom

with db_session() as session:
    advert_doms = session.query(AdvertDom).all()

for advert_dom in advert_doms:
    print(advert_dom.HTMLContent)

Насколько я понимаю, ошибка вызвана окончанием сеанса, который отключает список advert_doms от базы данных.


Если у меня есть функция, которая возвращает объект ORM или список объектов ORM, как я могу сделать так, чтобы объекты позднее «переподключались» к базе данных, чтобы код, приведенный выше, работал?

Вот пример того, что я имею в виду:

from src.mysqlClient import db_session
from src.mysqlClient.models import AdvertDom

def function_one():
    with db_session() as session:
        advert_doms = session.query(AdvertDom).all()
    return advert_doms

def function_two()
    advert_doms = function_one()

    # TODO: Do something here so that the code below will work.

    for advert_dom in advert_doms:
        print(advert_dom.HTMLContent)

1 Ответ

0 голосов
/ 12 января 2019

Ответ заключается в том, чтобы создать новый сеанс и выполнить session.add(orm_object):

from src.mysqlClient import db_session
from src.mysqlClient.models import AdvertDom

def function_one():
    with db_session() as session:
        advert_doms = session.query(AdvertDom).all()
    return advert_doms

def function_two()
    advert_doms = function_one()
    with db_session() as session:  # <-- New line of code
        for advert_dom in advert_doms:
            session.add(advert_dom)  # <-- New line of code
            print(advert_dom.HTMLContent)

Другой способ избежать этой проблемы - просто иметь один глобальный объект сеанса, который не получаетзакрыто до тех пор, пока не будут запущены обе функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...