Решение “ERROR 2006 (HY000): MySQL server has gone away" в цикличных программах

Предоставляю решение схожих проблем с той, с которой лично столкнулся недавно:

Бот Телеграм связан с MySQL базой пользователей, подключение к которой производилось лишь в начале кода (при запуске) из-за чего через некоторое время (около 10 часов) соединение обрывалось и бот выкидывал ошибки, т.к. не получал информацию о пользователе.

Я использую фреймворк mysql-connector и это решение состоит в использовании класса для обработки запросов к базе, который можно увидеть ниже с примерами использования.


Ответы (1 шт):

Автор решения: SecorD

Сам класс:

import logging

import mysql.connector

class DB():
    def __init__(self, **kwargs):
        self.conn = mysql.connector.connect(
            host="host",
            user="user",
            passwd="password",
            database="name"
        )
        try:
            self.cursor = self.conn.cursor()
        except Exception as e:
            print(str(e))

    def execute(self, query, data=None, ret1=False):
        try:
            if not self.conn:
                self.__init__()
            else:
                if data:
                    self.cursor.execute(query, data)
                else:
                    self.cursor.execute(query)

                if 'INSERT' in query or 'UPDATE' in query or 'DELETE' in query or 'DROP' in query:
                    self.conn.commit()

                if ret1:
                    return self.cursor.fetchone()
                else:
                    return self.cursor.fetchall()

        except:
            logging.error('end', exc_info=True)
            return 'error'

Пример таблицы:

Пример таблицы

Структура запроса:

res = DB().execute(запрос, защищённые данные) # fetchall
res = DB().execute(запрос, защищённые данные, True) # fetchone

Примеры использования:

> DB().execute("CREATE TABLE users (r_id INT AUTO_INCREMENT PRIMARY KEY, id INT UNIQUE, name VARCHAR(255), role INT NULL DEFAULT 3)")
> DB().execute("INSERT INTO users (id, name, role) VALUES (%s, %s, %s)", (65453, "Mike", 1,))
> res = DB().execute(f"SELECT * FROM users")
res = [(1, 146, "Nick", 3,), (2, 155, "John", 1,), (3, 678, "Michelle", 2,), (4, 65453, "Mike", 1,)]
> res = DB().execute(f"SELECT * FROM users WHERE name = %s", ("John",), ret1=True)
res = (2, 155, "John", 1,)

Если есть какие-то предложения по оптимизации, обязательно пишите!

→ Ссылка