Python固化周期性的sql請求
來自專欄 Python程序員5 人贊了文章
在實際的運營中經常需要周期性的執行多個sql進行分析或者撰寫報告,有時候甚至需要執行一些簡單的數學計算,如果單純的應用sql會很耗時,並且容易出錯,本文通過python、mysql和excel工具固化一些周期性的sql請求,形成相應的數據報告,進一步提高工作效率,減少人為的錯誤。
準備工具:
(1)python(本文中用的是anaconda總的jupyter notebook)
(2)一個能運行的mysql資料庫(可以是本地也可以是遠程的)
(3)excel(結果會保存在Excel中)
1、開始
首先需要安裝並載入相應的Python的函數庫(pip 工具進行安裝就行)
(1)pymysql (用Python連接mysql工具)
(2)openpyxl(用Python中的數據保存到excel中)
註:之前用的是xlwt這個函數庫,應為這個是默認保存的是後綴為xls的excel文件,這個格式的每個sheet只能保存65536行,如果要想保存更多的行需要將文件保存成xlsx格式的。
2、Python連接mysql資料庫
首先需要知道mysql資料庫的host地址,用戶名、密碼,埠號(默認為3306),需要使用的資料庫,最後需要指定字符集為utf8。
#1、創建資料庫連接對象db = pymysql.connect(host=****,user=*****, password=******, port=3306,db=****,charset=utf8)#2、創建資料庫游標cursor = db.cursor()#3、編寫響應的sql語句sql =("SELECT trim(pho)" "FROM user_app" "where create_time=%s")#4、執行SQL語句cursor.execute(sql,2018-06-01)#5、獲取SQL語句的結果data = cursor.fetchall()#6、關閉資料庫連接對象db.close()
主要分為如下5步:
(1)使用資料庫信息連接相應的資料庫;
這一步要特別注意需要指定字符集,否則會出現亂碼的情況。
(2)使用連接對象的cursor()方法創建資料庫游標;
依據(1)中的連接對象創建cursor對象,後面的操作都是基於cursor對象來做的,包括執行sql語句,接受sql語句的結果
(3)編寫相應的SQL語句;
一般需要固化的sql語句都是比較複雜或者是比較長的sql,這就需要將其放入多行中,另外sql中可能會含有相應的變數,在mysql中都用%s代替,在查詢的時候指定相應的值即可,如上面的例子中將create_time作為變數.
(4)執行sql語句;
應用cursor方法中的execute方法執行SQL語句,並指定相應參數的值。
(5)獲取sql語句的結果
cursor方法中有fetchone、fetchmany和fetchall三個方法,其中fetchone獲取結果的一條數據,fetchmany獲取指定條數的數據,fetchall獲取所有的結果數據。
(6)關閉資料庫連接對象
在使用完成資料庫連接對象後,需要關閉連接對象,釋放資源。
3、將結果寫入到excel文件中
應用python連接mysql,執行的sql語句的返回結果為tuple類型,通過遍歷sql結果的tuple將數據存在excel中的指定位置,主要步驟有:
(1)創建excel文檔
應用openpyxl函數庫中的Workbook()方法創建excel文檔對象。
(2)創建相應的sheet
在創建excel文檔的時候默認創建了一個名為sheet1的sheet,可以通過active獲取到處於打開的sheet,當然如果你不創建sheet默認就往sheet1中寫數據的。
(3)寫入數據
通過cell方法並指定位置進行寫入數據。
(4)保存Excel文件
將寫入數據的excel對象通過save方法保存到本地文件系統中。
# 1、建立excel文檔對象wb = openpyxl.Workbook()#2、獲取或者是創建相應的sheet#獲取當前處於打開狀態的sheet,並重命名ws = wb.activews.title=統計日期範圍#直接創建相應的sheetws = wb.create_sheet(title=結果)#3、向處於打開狀態的sheet中寫入數據ws.cell(row = j, column = 1).value = 123232#4、將寫入數據的excel文檔對象保存到本地wb.save(sql執行結果.xlsx)
其實應用openpyxl函數庫可以對excel進行更加複雜的操作,在此就不一一的例舉了。
結合2、3中的方法可以完美的固化一些日常的資料庫查詢工作,告別枯燥的、僵化的工作,進一步提高工作效率,如果是周期性的工作,可以將相應的程序做成定時任務,這樣就可以減少人為的干預了,直接分析結果就行了。
更加詳細和具體的方法請參考:
python 操作MySQL資料庫 | 菜鳥教程
推薦閱讀:
※MySQL table_share總結
※深入理解二階段提交協議(DDB對XA懸掛事務的處理分析)(一)
※[Python]MySQL中文字元與Python中文字元
※MySQL兩種引擎的區別
※sysbench的lua小改動導致的性能差異(上)