0

我对 SQLAlchemy 相当陌生,我想知道用会话编写代码并将 sqlalchemy 查询拆分为几个函数并在出现任何异常时避免僵尸会话(为了避免溢出池并使服务器不负责任)的正确风格是什么所以,我的问题可以在一个函数中创建会话并作为参数传递到另一个函数中,在内部调用flush,在外部提交中使用finnaly,这是安全的方法还是有更好的方法?例如

class Fetcher(object):

    def main(self, name):
        try:
            session = Session()
            user = session.query(UserModel).filter(UserModel.name.like(name)).first()
            if user and user.active:
                relatives = _fetch_relatives(session, user.id)
                user.active = utc_time()
                session.commit()
        except Exception as e:
            print e
            session.rollback()
        finally:
            session.close()


    def _fetch_relatives(self, session, id):
        relatives = []
        try:
            for r in session.query(RelativesModel).filter(RelativesModel.relative_id == id).all():
                relatives.apped({'name': r.name, 'age': r.age})
                r.readed = utc_time()
                session.flush()
        except Exception as e:
            print e
            session.rollback()
        finally:
            session.close()
        return relatives
4

1 回答 1

1

最好的方法是为整个操作只设置一个最外层的事务范围。你在哪里划定这个范围通常取决于应用程序的工作方式,这里有一些想法

对于给出的示例,只有一个最外层范围可能看起来像这样,看到您的对象被称为“提取器”,我假设您的应用程序中的典型用例必须获取不止一个东西 - 最好保留与数据库特定部分一起使用的对象范围之外的事务和会话范围:

class Fetcher(object):

    def main(self, session, name):
        user = session.query(UserModel).filter(UserModel.name.like(name)).first()
        if user and user.active:
            relatives = _fetch_relatives(session, user.id)
            user.active = utc_time()

    def _fetch_relatives(self, session, id):
        relatives = []
        for r in session.query(RelativesModel).filter(RelativesModel.relative_id == id).all():
            relatives.apped({'name': r.name, 'age': r.age})
            r.readed = utc_time()
            session.flush()
        return relatives

def run_my_program():
    session = Session()
    try:
        f1 = Fetcher()
        f1.main(session, "somename")

        # work with other fetchers, etc.

        session.commit()
    except Exception as e:
        session.rollback()
    finally:
        session.close()
于 2013-08-12T14:45:05.590 回答