SqlAlchemy сессии застряли, когда они не используются - PullRequest
0 голосов
/ 21 ноября 2018

Мне трудно реализовать класс "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.

Любая помощь будет принята с благодарностью,

С уважением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...