SqlAlchemy会话在不使用它们时卡住

时间:2018-11-21 08:14:31

标签: python-3.x sqlalchemy

我很难为我的应用程序实现“ MySqlClient”类。我的应用程序由几个模块组成,这些模块必须利用我的数据库,并且其中一些模块在其他线程上运行。

我的意图是为需要与MySql数据库通信的每个模块创建一个实例。例如:每个连接到Websocket服务器的客户端都创建自己的实例,电报bot客户端也具有自己的实例..

我已经搜索了好几天,我已经阅读了文档,搜索了论坛..但不知何故我缺少了一些东西,或者我没有以正确的方式实现它。

这是我的课程:

class MySqlClient():

    engine = None
    Session = None

    def __init__(self):     

        # create engine
        if MySqlClient.engine == None:
            MySqlClient.engine = sqlalchemy.create_engine("mysql+mysqlconnector://{0}:{1}@{2}/{3}".format(
                state.config["mysql"]["user"],
                state.config["mysql"]["password"],
                state.config["mysql"]["host"],
                state.config["mysql"]["database"]
            ))
            MySqlClient.Session = scoped_session(sessionmaker(bind=MySqlClient.engine))
            Base.metadata.create_all(MySqlClient.engine)

        self.session = MySqlClient.Session()

    def get_budget(self, budget_id):   
        try:

            q = self.session.query(
                (Budget.amount).label("budgetAmount"), 
                func.sum(BudgetRecord.amount).label("total")
                ).all().filter(Budget.id == budget_id).join(BudgetRecord).filter(extract("month", BudgetRecord.ts) == datetime.datetime.now().month)
            self.session.close()

            return { "budgetAmount": q[0].budgetAmount, "total": 0.0 if q[0].total == None else q[0].total }

        except Exception as ex:
            logging.error(ex)

        return None

启动我的应用程序时,一切运行正常,我可以执行方法“ get_budget”来返回数据。但是,如果在此之后我等待5分钟,则该方法将不会再次运行(如果我不等待,它将仍然有效)。在拨打电话大约15分钟后,查询最终失败,提示MySql连接已断开:

(mysql.connector.errors.OperationalError) MySQL Connection not available.

我还尝试在执行新查询之前获得一个新会话。那也没有帮助。

我之前已经做过这样的事情,但这是我第一次使用ORM,我想保留使用ORM的好处。

任何帮助将不胜感激,

致谢

0 个答案:

没有答案