8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

Python mysql(使用pymysql)自动重新连接

rischan 1月前

107 0

我不确定这是否可行,但我正在寻找一种在连接丢失时重新连接到 mysql 数据库的方法。所有连接都保存在 gevent 队列中,但我认为这不重要...

我不确定这是否可行,但我正在寻找一种在连接丢失时重新连接到 mysql 数据库的方法。所有连接都保存在 gevent 队列中,但我认为这不重要。我确信如果我花点时间,我可以想出一种重新连接到数据库的方法。然而,我浏览了 pymysql 代码,发现 Connection 类中有一个“ping”方法,我不确定如何使用它。

该方法看起来第一次会重新连接,但之后它又将重新连接标志切换为 False?我可以使用这种方法吗?或者如果丢失连接,是否有其他方法建立连接?即使不是 pymysql,人们如何应对数据库服务器宕机并必须重新建立与 mysql 服务器的连接?

def ping(self, reconnect=True):
    ''' Check if the server is alive '''
    if self.socket is None:
        if reconnect:
            self._connect()
            reconnect = False
        else:
            raise Error("Already closed")
    try:
        self._execute_command(COM_PING, "")
        return self._read_ok_packet()
    except Exception:
        if reconnect:
            self._connect()
            return self.ping(False)
        else:
            raise
帖子版权声明 1、本帖标题:Python mysql(使用pymysql)自动重新连接
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由rischan在本站《mysql》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 很老了,但我在程序中访问托管数据库时遇到了类似的问题。我最终使用的解决方案是创建一个装饰器,在进行查询时自动重新连接。

    给定一个连接函数:

    def connect(self):
        self.conn = mysql.connector.connect(host=self.host, user=self.user, 
        database=self.database, password=self.password)
        self.cursor = self.conn.cursor()
        print("Established connectionn...")
    

    我创建了

    def _reconnect(func):
        @wraps(func)
        def rec(self,*args,**kwargs):
            try:
                result = func(self,*args,**kwargs)
                return result
            except (mysql.connector.Error, mysql.connector.Warning) as e:
                self.connect()
                result = func(self,*args,**kwargs)
                return result
        return rec 
    

    这样任何使用连接的函数现在都可以被修饰成这样

    @_reconnect
    def check_user_exists(self,user_id):
        self.cursor.execute("SELECT COUNT(*) FROM _ where user_id={};".format(user_id))
        if self.cursor.fetchall()[0][0]==0:
            return False 
        else:
            return True
    

    该装饰器将重新建立连接并重新运行涉及数据库查询的任何功能。

返回
作者最近主题: