Python mysqlDB 掉線自動連線 返回插入字典
阿新 • • 發佈:2019-02-07
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())