Pymysql. Lost connection to MySQL server during query

написал телеграм бота на python и решил подключить к нему базу данных. Бывает происходит одна из ошибок и бот "падает". Ошибки: "Packet sequence number wrong" и "2013, Lost connection to MySQL server during query". Код с запросами к базе данных:

class SQL:

def __init__ (self, host, user, password, dbname):
    self.connection = pymysql.connect(host, user, password, dbname)
    self.cursor = self.connection.cursor()

def check_user(self, user_id):
    if self.connection.ping(True):
        self.cursor.execute('SELECT `user_id` FROM `users` WHERE `user_id`=%s', (user_id))
        result = self.cursor.fetchall()
        self.connection.commit()
        return(bool(len(result)))

def check_ban_user(self, user_id):
    self.cursor.execute('SELECT `user_id` FROM `banlist` WHERE `user_id`=%s', (user_id))
    result = self.cursor.fetchall()
    self.connection.commit()
    return(bool(len(result)))`

Класс "SQL" импортирую в исполняемый файл и от него вызываю функции с запросами к бд.

Запросов ещё много, но они аналогично построены как и эти. Есть предположение, что ошибки выскакивают из-за того, что не закрывается соединение с БД. Как его правильно закрывать я так и не выяснил, потому что когда я закрываю его в одной из функций, бот ничего не получает и в консоли выдается это: (0, ''). Буду очень признателен. кто поможет решить данную проблему. Не судите строго, только учусь работать с базами данных. Спасибо


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

Автор решения: fire studio

Для того чтобы предотвратить закрытие подключения к MySQL по неактивности в Python, вы можете использовать параметр autocommit для соединения к базе данных и опцию wait_timeout на стороне сервера MySQL.

Установите параметр autocommit равным True при установке соединения с MySQL:

import mysql.connector

# Установка соединения с MySQL
conn = mysql.connector.connect(
  host="localhost",
  user="username",
  password="password",
  database="database_name",
  autocommit=True
)

Установка autocommit=True гарантирует, что каждый запрос к базе данных будет автоматически подтверждаться (commit).

Настройте опцию wait_timeout на стороне сервера MySQL. Она определяет время неактивности (в секундах), после которого соединение будет автоматически закрыто. Для изменения этого значения вам может потребоваться доступ к конфигурационному файлу MySQL (обычно my.cnf). В этом файле найдите или добавьте строку wait_timeout=value, где value это желаемое время в секундах.

Также есть возможность установить значение INTERVAL на стороне сервера MySQL, чтобы посылать команды PING с определенной периодичностью и таким образом поддерживать активное соединение. Пример использования:

    import mysql.connector
    
    # Установка соединения с MySQL и настройка опции ping
        conn = mysql.connector.connect(
          host="localhost",
          user="username",
          password="password",
          database="database_name",
          autocommit=True,
          connection_timeout=86400,    # устанавливаем таймаут подключения
          pool_ping_interval=300       # интервал (в секундах) между командами PING
        )

В приведенном выше примере используются параметры connection_timeout и pool_ping_interval. Первый может быть полезен, чтобы увеличить таймаут ожидания соединения, а второй устанавливает интервал между командами PING на уровне пула соединений.

Не забудьте заменить "localhost", "username", "password" и "database_name" на реальные значения для вашей базы данных MySQL.

Эти шаги помогут вам сохранить подключение к MySQL открытым и предотвратить его закрытие из-за неактивности.

→ Ссылка