1. 程式人生 > >Python mysqlDB 掉線自動連線 返回插入字典

Python mysqlDB 掉線自動連線 返回插入字典

python 操作mysql  經常會遇見(mysql  gone away)這類的錯誤,原因主要是過長時間沒有操作mysql導致mysql斷開或mysql重啟之類的。

mysql查詢一般返回的都是元組,資料列比較多的話操作不是很方便。

import MySQLdb

class DB:
    #----------------------------------------------------------------------
    def connect(self):
        self.conn = MySQLdb.connect('127.0.0.1', 'user', 'password', 'test', charset="utf8")
    #----------------------------------------------------------------------
    def update(self,sql,arg):
        error = True
        try:
            cur = self.conn.cursor()
            cur.execute(sql,arg)
            self.conn.commit()
            error = False
        except (AttributeError, MySQLdb.OperationalError),e:
            error = e.args
            self.connect()
            cur = self.conn.cursor()
            cur.execute(sql,arg)
            self.conn.commit()
            error = False
        except MySQLdb.Error,e:
            error = e.args
        finally:
            return error
    #----------------------------------------------------------------------
    def query(self, sql):
        cur = None
        error = True
        try:
            cur = self.conn.cursor()
            cur.execute(sql)
            error = False
        except (AttributeError, MySQLdb.OperationalError), e:
            error = e.args
            self.connect()
            cur = self.conn.cursor()
            cur.execute(sql)
            error = False
        except MySQLdb.Error,e:
            error = e.args
        finally:
            return [cur,error]
    #----------------------------------------------------------------------
    def close(self):
        try:
            if self.conn:
                self.conn.close()
        except:
            pass
db = DB()
insert_sql = ''
arg = []
error = db.update(insert_sql,arg) #插入或更新,成功返回Flase,失敗返回錯誤資訊
if error:
    print error

query_sql = ''
[cur, error] = db.query(query_sql) #查詢,成功返回cursor,失敗返回錯誤資訊
if not error:
    rows =cur.fetchall() 
else:
    print error

返回字典:

import itertools
#----------------------------------------------------------------------
def fetch_many(cur):
    field_names = [d[0].lower() for d in cur.description]
    while True:
        rows = cur.fetchmany()
        if not rows: return
        for row in rows:
            yield dict(itertools.izip(field_names, row))
#----------------------------------------------------------------------
def fetch_one(cur):
    field_names = [d[0].lower() for d in cur.description]
    row = cur.fetchone()
    if not row: return
    return dict(itertools.izip(field_names, row))

插入字典:

db = DB()
myDict = {}
placeholders = ', '.join(['%s'] * len(myDict))
columns = ', '.join(myDict.keys())
sql = "INSERT into %s ( %s ) VALUES ( %s )" % ('tableName', columns, placeholders)
db.update(sql, myDict.values())