最近須要導數據的狀況太多,總用跳板機上的navicat工具備點效率低,也以爲挺麻煩的(因爲跳板機沒法連通外網 因此導出數據文件還得經過sftp傳到本機)
anyway 仍是寫個腳本好了。以前寫過一個shell腳本作的定時導出任務,如今試試用python寫下python
主要用到的庫有:
pymysql -- 連數據庫的無需多說
os & sys -- 可能回涉及到工做目錄或者外部傳參
xlwt -- 寫excelmysql
下面就是代碼了,整體仍是挺簡單的,主要遇到個字符編碼的問題,改爲utf-8就解決了
還有個沒解決掉的問題: select的結果沒有字段名,因此....文件第一行的字段我是手動加進去的 =.=sql
#!/usr/bin/python # -*- coding: cp936 -*- # security:數據庫相關的敏感參數最好經過傳參形式傳入而非寫入腳本 import pymysql import xlwt import os,sys def dbConnect(dburl): db_user = sys.argv[1] db_pass = sys.argv[2] db_name = raw_input("要使用的數據庫:") db_conn = pymysql.connect(dburl,db_user, db_pass, db_name)# db_name傳參失敗?編碼問題"?" return db_conn def sqlOpt(opt): db_conn = dbConnect("localhost") cur = db.cursor() cur.execute(opt) data = cur.fetchall() db_conn.close() return data def write_to_excel(content): os.chdir("/home/appuser/export_mysql_data/") filename = raw_input("請輸入要保存的文件名,無需後綴:") + '.xls' wbk = xlwt.Workbook(encoding='utf-8') test = wbk.add_sheet('test',cell_overwrite_ok=True) # ?如何獲取列名 fileds = [u'ID',u'name',u'sex',u'birth',u'department',u'address'] trans_data = list(content) # 寫入列名 for filed in range(0,len(fileds)): test.write(0,filed,fileds[filed]) for row in range(1,len(trans_data)+1): for col in range(0,len(fileds)): test.write(row,col,str(trans_data[row-1][col])) wbk.save(filename) def run_Task(): sql = raw_input("請輸入sql查詢語句:") result = sqlOpt(sql) write_to_excel(result) run_Task()
----------------------------------------------------------------分割線----------------------------------------------------------------------------
11.1更
解決了手動輸入列名的問題,代碼更改以下:shell
import pymysql import xlwt import os # import pandas as pd # database conn def dbConnect(dburl): db_user = 'developer' db_pass = '1qaz2wsx#EDC' # db_name = input("要使用的數據庫:") db_conn = pymysql.connect(dburl, db_user, db_pass) return db_conn #獲取列名 def getCol(opt): db_conn = dbConnect("10.1.188.241") cursor = db_conn.cursor() cursor.execute(opt) col = tuple([tuple[0] for tuple in cursor.description]) db_conn.close() return col #獲取數據 def sqlOpt(opt): db_conn = dbConnect("10.1.188.241") cursor = db_conn.cursor() cursor.execute(opt) data = cursor.fetchall() # final_data = col + data db_conn.close() return data # 寫入文件 def write_into_excel(col_name, content): os.chdir("D:\whj") filename = input("請輸入要保存的文件名,無需後綴:") + '.xls' wbk = xlwt.Workbook(encoding='utf-8') test = wbk.add_sheet('test', cell_overwrite_ok=True) fileds = list(col_name) trans_data = list(content) # 寫入列名 for filed in range(0, len(fileds)): test.write(0, filed, fileds[filed]) for row in range(1, len(trans_data)+1): for col in range(0, len(fileds)): test.write(row, col, u'%s' % str(trans_data[row-1][col])) wbk.save(filename) # 主函數 def run_Task(): sql = "select name,phone from wechat.sys_user;" result = sqlOpt(sql) col_name = getCol(sql) # print(result) # print(col_name) write_into_excel(col_name, result) run_Task()