python快速導出sql語句(mssql)的查詢結果到Excel,解決SSMS無法加載大字段的問題


 

遇到一個尷尬的問題,SSMS的GridView對於大字段的(varchar(max),text之類的),支持不太友好的,
超過8000個長度之外的字符,SSMS的表格是顯示不出來的(當然也就看不到了),也是無法直接導出來的(超過8000個之外的字符的)
這種問題在別人遇到來求助的時候,是不可忍受的,於是快速用Python寫了一個導出數據到Excel的功能,
最主要的是可以導出大字段的內容,且方便簡潔,人畜無害,綠色環保,不太喜歡SSMS那種下一步下一步……的操作。那些在SSMS中無法顯示出來的字段,這下可以顯出原形了。

1,必選參數是服務器地址和sql語句,如果sql語句沒有帶庫名的話,那么必須傳入數據庫的名字,否則默認是master庫,因此sql盡量帶庫名吧
2,導出路徑是C:\Windows\Temp\,導出完成后自動打開,方便查看,另存
3,根據sql語句,導出完成的查詢結果,第一行是字段名,其余是查詢結果
4,依賴於xlsxwriter這個包
5,沒有太嚴格的參數校驗以及數據庫賬號密碼支持,有需要的自己改造

import os
import re
import time
import pymssql
import xlsxwriter
import argparse

def get_data_from_db(host='127.0.0.1',server='mssql',port=1433,database='master',sql_stament=''):
    conn = pymssql.connect(host=host, server=server,port=port, database=database,as_dict=True, autocommit=True)
    cursor = conn.cursor()
    # 簡單的判斷,別尼瑪執行了truncate啥的
    if len(sql_statment)<6 or not (re.match(r'^select',sql_statment.lstrip())):
        print('sql statment is error,exit……')
        exit(1)
    try:
        cursor.execute(sql_stament)
        result = cursor.fetchall()
    except:
        raise
    finally:
        cursor.close()
        conn.close()
    return result


def export_to_excel(result):
    current_time = time.strftime("%Y%m%d%H%M%S", time.localtime())
    workbook = xlsxwriter.Workbook('C:\\Windows\\Temp\\'+current_time+'_temp.xlsx')
    worksheet = workbook.add_worksheet("sheet1")
    # head row
    col = 0
    for key in result[0].keys():
        worksheet.write(0, col, key)
        col = col+1
    # data row
    row = 1
    col = 0
    for dict in result:
        for key in dict:
            worksheet.write(row, col, str(dict[key]))
            col = col + 1
        col = 0
        row += 1
    workbook.close()
    os.startfile('C:\\Windows\\Temp\\'+current_time+'_temp.xlsx')


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--host",required=True, type=str,help="host name or ip")
    parser.add_argument("--db",required=False, type=str,help="database name")
    parser.add_argument("--sql", required=True, type=str, help="sql statment")
    args = parser.parse_args()
    host = args.host
    database = args.db
    if not database:
        database='master'
    sql_statment = args.sql
    print('executing sql……')
    result = get_data_from_db(host = host,database = database,sql_stament =sql_statment)
    print('exporting data……')
    export_to_excel(result)

    # example
    # python export_data_to_excel.py --host "127.0.0.1" --sql "select * from tempdb.dbo.Test"

 

 

在10W級別以下,速度還是可以的,這是個demo

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM