Мне трудно реализовать класс "MySqlClient" для моего приложения.Мое приложение состоит из нескольких модулей, которые должны использовать мою базу данных, а некоторые модули работают в других потоках.
Я собираюсь создать экземпляр для каждого модуля, который должен взаимодействовать с моей базой данных MySql.Например: каждый клиент, подключающийся к серверу веб-сокетов, создает свой собственный экземпляр, у клиента-бота Telegram есть свой собственный экземпляр:
Я искал несколько дней, я прочитал документы, искалфорумы .. но почему-то я что-то упускаю или я не реализую это правильно.
Это мой класс:
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.
Любая помощь будет принята с благодарностью,
С уважением