最近在项目在使用peewee 的时候遇到该错误,于是上网搜了下对应的错误:
https://stackoverflow.com/questions/6650940/interfaceerror-0
都是说因为关闭了连接对象然后继续去操作数据库。因为peewe使用的是pymysql作为连接,查看了一下源码,做了个小实验。
import pymysql.cursors
# Connect to the database
connection = pymysql.connect(host='ip',
user='username',
password='password',
db='database',
charset='utf8',
cursorclass=pymysql.cursors.DictCursor)
connection.close()
cursor = connection.cursor()
print cursor.execute("show master status;")
print cursor.fetchall()
从中可以看出,在操作数据库过程中,如果连接对象被关闭,则会造成该错误。但是,在我查看代码后,并没有关闭连接对象的操作。一顿纳闷后,发现了有个批量插入的操作,而mysql使用的还是默认配置。默认的参数max_allowed_packet 是4M,当客户端对服务器传输的包超过这个值则会造成mysql gone away 的错误,所以在使用peewee 中的批量插入insert_many进行了,判断,遇到该错误,则进行减半操作。但是这次错遇到了这个连接关闭的错误,所以还是治本好,直接将该值设置1G,当然前提你的服务器,内存要足够,不然也会造成服务器奔溃的现象。于是该问题久迎刃而解了。
关于max_allowed_packet的说明:https://dev.mysql.com/doc/refman/5.5/en/packet-too-large.html