最近须要导数据的状况太多,总用跳板机上的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()