代码之家  ›  专栏  ›  技术社区  ›  Nathan Wailes

如何将ORM对象或此类对象的列表与数据库“重新连接”?

  •  0
  • Nathan Wailes  · 技术社区  · 6 年前

    我的理解是,以下代码将返回错误:

    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 回复  |  直到 6 年前
        1
  •  0
  •   Nathan Wailes    6 年前

    答案是创建一个新的会话并执行 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)
    

    另一种避免这个问题的方法是只拥有一个全局会话对象,在两个函数都运行之前它不会被关闭。