python 连接mysql 时,connect 出现错误,解决
# -*- coding: utf-8 -*-
import MySQLdb
from MySQLdb.cursors import DictCursor
def catch_2006(func):
"""
To catch MySQL Error 2006 ('Server has gone away')
"""
def _(self, *args, **kwargs):
try:
return func(self, *args, **kwargs)
except MySQLdb.Error, e:
print __file__, e
if e.args[0] == 2006 or e.args[0] == 0:
self.reboot_conn()
return func(self, *args, **kwargs)
# todo
# How to deal if not the code
return _
class DB(object):
def __init__(self, host, port, user,
passwd, db, use_unicode=True, charset='utf8'):
self.host = host
self.port = port
self.user = user
self.passwd = passwd
self.db = db
self.use_unicode = use_unicode
self.charset = charset
@property
def conn(self):
if not hasattr(self, '__conn'):
self.__conn = MySQLdb.connect(
host=self.host,
port=self.port,
user=self.user,
passwd=self.passwd,
db=self.db,
use_unicode=self.use_unicode,
charset=self.charset
)
return self.__conn
def reboot_conn(self):
if hasattr(self, '__conn'):
try:
self.__conn.close()
del self.__conn
except:
pass
@catch_2006
def query(self, sql, args=None):
print sql
cursor = self.conn.cursor()
cursor.execute(sql, args)
cursor.execute('commit')
cursor.close()
@catch_2006
def select(self, sql, args=None, is_dict=False, is_one=False):
# print sql, args
if is_dict:
cursor = self.conn.cursor(cursorclass=DictCursor)
else:
cursor = self.conn.cursor()
cursor.execute(sql, args)
if is_one:
resultset = cursor.fetchone()[0]
else:
resultset = cursor.fetchall()
cursor.close()
return resultset