用python腳本導出mysql數據庫查詢結果到Excel表

最近須要導數據的狀況太多,總用跳板機上的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()
相關文章
相關標籤/搜索