问题描述:
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()