最近需要導數據的情況太多,總用跳板機上的navicat工具有點效率低,也覺得挺麻煩的(由於跳板機無法連通外網 所以導出數據文件還得通過sftp傳到本機)
anyway 還是寫個腳本好了。之前寫過一個shell腳本做的定時導出任務,現在試試用python寫下
主要用到的庫有:
pymysql -- 連數據庫的無需多說
os & sys -- 可能回涉及到工作目錄或者外部傳參
xlwt -- 寫excel
下面就是代碼了,總體還是挺簡單的,主要遇到個字符編碼的問題,改成utf-8就解決了
還有個沒解決掉的問題: select的結果沒有字段名,所以....文件第一行的字段我是手動加進去的 =.=
#!/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()