【问题标题】:Solving “ERROR 2006 (HY000): MySQL server has gone away" in cyclical programs (mysql-connector-python)解决循环程序中的“ERROR 2006 (HY000): MySQL server has gone away”(mysql-connector-python)
【发布时间】:2020-05-20 12:05:52
【问题描述】:

我为最近遇到的类似问题提供了解决方案

我有带有 MySQL 用户数据库的 Telegram(信使)机器人。在代码开始时存在与它的连接,导致连接在大约 10 小时后消失。因此,机器人返回错误,因为无法获取有关用户的信息。

我使用mysql-connector-python 框架。解决方案是使用 class 进行数据库查询。您可以在下面看到它和使用示例。

【问题讨论】:

  • 需要更多信息...您需要捕获这些错误,并在数据库备份时继续处理...
  • 这不是问题。这是我找不到的这个问题的解决方案。
  • 好的。很高兴您找到了解决方案。

标签: python mysql mysql-connector mysql-connector-python mysql-error-2006


【解决方案1】:

班级

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'

表格示例

Table example

查询结构

res = DB().execute(query, protected data) # fetchall
res = DB().execute(query, protected data, 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,)]
> res = DB().execute(f"SELECT * FROM users WHERE name = %s", ("John",), ret1=True)
res = (2, 155, "John", 1,)

如果您有一些优化建议,请写出来!

【讨论】:

    猜你喜欢
    • 2012-10-30
    • 2017-12-21
    • 2020-05-28
    • 2015-12-02
    • 2020-06-15
    • 2013-12-16
    • 2011-12-11
    • 2012-12-19
    • 2011-02-04
    相关资源
    最近更新 更多