我很难为我的应用程序实现“ 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的好处。
任何帮助将不胜感激,
致谢