本文基於python, 使用pandas, pymysql等三方庫實現了向資料庫中高效批量插入數據,一方面提供被網上很多瞎轉載的答案給坑蒙了的人(因為我也是),一方面自己也做個筆記,以後方便查閱。
01需求原因
最近在處理一個需求,有關批量往資料庫插入數據的,描述如下:
原來的程序是基於sql的存儲過程進行數據的更新修改操作,由於數據量較大,導致對資料庫壓力太大,於是需要將程序重構為用python讀取文件的方式將數據做計算處理,減少這部分的壓力,最後僅僅將計算的結果調用aws的lambda服務重新更新到資料庫中就可以了,減少了極大的壓力,也降低了成本。涉及資料庫主要是插入及更新操作。
02版本庫信息
基於linux系統寫的三方庫 >>> pandas 1.0.5, pymysql 0.9.3python版本 >>> 3.7標準庫 >> os
03邏輯梳理
實際上,最後一步,要寫入資料庫的文件數據是存儲在內存中的。因為讀取文件後進行的計算都是在內存中進行的,那麼計算的結果也沒必要再寫到本地,再去讀取,再寫入資料庫,這是會影響程序的效率的。邏輯如下:
首先讀取文件文件的拼接及計算,生成新的df初始化資料庫的連接將df所需數據轉換為元組數據(取決於資料庫的三方庫的接口是如何支持批量操作的)再將數據寫入資料庫檢查資料庫內容
04分步實現及分析
讀取文件
給文件路徑,然後去讀文件就行了,強調一下需要注意的點
絕對路徑: 這種最簡單,直接給路徑字符串就行了,但是一旦文件夾目錄結構變化,就需要頻繁的改相對路徑: 我一般喜歡先在腳本中定位當前腳本的位置,然後通過相對路徑去找,這樣只要你整個包內部的目錄結構不變化,都不用改,就算部署上線也是直接根據包的位置來,很方便pandas默認會將所有數字讀取為float類型,所以對於那種看起來是數字,但實際上是需要當作字符串使用的欄位進行類型的轉換
文件的拼接及計算
文件的拼接主要就是merge和concat兩個語法的使用,強調一下小知識點
merge語法主要是對應於sql語言的內連接,外連接,左連接和右連接等concat主要是用來將相同結構的df單純的拼接起來(也就是列表的總行數增加)
初始化連接
導入三方庫pymysql,初始化連接
對應接口轉換數據
數據插入要考慮寫入一個事務,因為失敗的話,要保證對資料庫沒有影響構造符合對應接口的數據格式,通過查詢,pymysql有兩種可以執行語句的接口a)execute(單條插入語句)執行單條語句的接口,類似這種: Insert into table_name (column) values (value);b)executemany(批量插入語句)執行多條語句的接口,類似這種: Insert into table_name (column1, column2, column3) values (value1, value2, value3);具體實現如下
將數據寫入資料庫這個簡單,直接上代碼
檢查資料庫是否插入成功
如果沒問題的話,就可以同時進行多個文件讀寫,計算,最後啟用多線程同時向資料庫中寫入數據了,非常高效
05完整代碼
如果覺得寫的還行,就點個關注吧,我會繼續努力的,謝謝各位看官。如果文中您發現了什麼問題,煩請指出,甚是感謝!
<END>