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 шт):
Для того чтобы предотвратить закрытие подключения к 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 открытым и предотвратить его закрытие из-за неактивности.