Django操作MySQL报错pymysql.err.OperationalError: (2013, ‘Lost connection to MySQL server during query‘)

问题描述:

Django操作MySQL数据库时报错
因莫名原因 在启用mysql事务后间隔25秒以上的数据库操作会报错
数据库信息: wait_timeout:30
(怀疑是因为等待时间太短导致mysql服务将此次链接中断,当再次用本次链接取查询时报错)
在这里插入图片描述

Django ORM操作代码:

# 数据库关闭了自动提交功能 该装饰器为启用mysql事务 否则无法插入数据
@transaction.atomic
def change_db(table_name, operation_type, **kwargs):
    """
    CameraInfo(ip="", region="", ip_is_work="", ip_is_sensitive="")
    CameraOffsetRecord(ip="", offset_pic_path="", offset_date="", reset_date="")
    kwargs传入key必须与表字段名保持一致
    """
    if operation_type == 'creat':
        # 插入数据
        if table_name.objects.filter(ip=kwargs['ip']).last().reset_date:
            # 如果最后的一条记录中摄像头没有回正日期则不在新增该摄像头的偏移记录
            obj = table_name(**kwargs)
            obj.save()
        else:
            pass
    elif operation_type == 'update':
        # 修改数据
        obj = table_name.objects.filter(ip=kwargs['ip']).last()
        obj.reset_date = kwargs['reset_date']
        obj.save()


原因分析:

原理未知,有大佬知道详细原因麻烦留言解惑,不胜感激。
表面理解为因为数据库设置wait_timout太短,导致初次连接上mysql并执行表操作后短时间没有新的请求发出而被mysql服务端关闭了此次连接
但由于使用了事务 在下次操作mysql表时仍然使用了第一次的连接,而此时它已经被关掉了


解决方案:

在操作完成后在客户端关闭本次连接,下次操作mysql时会重新开启新的连接,从而规避此问题。
(不要在change_db函数里调用,我是放在views文件里的,在调用change_db函数后调用本函数)

from django.db import connection


def close_connection():
    if not connection.in_atomic_block:
        connection.close()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值