1. 程式人生 > 資料庫 >python讀取SQLServer資料庫的image格式資料並匯出為圖片

python讀取SQLServer資料庫的image格式資料並匯出為圖片

本篇內容來自https://blog.csdn.net/u011418173/article/details/79641348

 

起因

之前專案是用資料庫的image格式儲存圖片,但是考慮到圖片一旦很大的時候,客戶端載入圖片的速度就會變得非常慢,導致登入時間很長。因此必須改為用url的方式,將圖片的url記錄在資料庫中,指向一個圖片的虛擬儲存位置。
下圖顯示的就是某個使用者的頭像,以二進位制的形式儲存在欄位photo中,這裡用視覺化的方式顯示給大家。
這裡寫圖片描述

解決方法

既然不想在資料庫儲存圖片,但是現有的圖片都儲存在資料庫,所以理所當然應該將圖片資料(sqlserver是用image二進位制的格式儲存的)匯出並重新儲存到png等格式的檔案中。這一步當然不能一個個手動的處理,不然效率太慢了。

解決的方法挺多的,曾考慮過使用c++或是java的方式實現,但思前想後,還是決定用python,因為語法真的超簡潔有木有,等下看程式碼就知道啦~


首先要做一些準備工作:

  • 安裝python2.7.14
    其實只要是2.7系列,應該都是可以的

  • 使用pip安裝pyodbc
    pip的使用很簡單,拿win10舉例,在python的安裝路徑下,進入Scripts資料夾,按住shift在空白處單擊右鍵,如圖所示:
    這裡寫圖片描述
    點選“在此處開啟Powershell視窗”按鈕,可以在這個目錄下開啟控制檯,而不用在cmd中慢慢敲路徑(小技巧)
    然後在控制檯輸入“pip install pyodbc”,就可以自動安裝pyodbc模組了

  • 使用pip安裝Pillow
    方法同pyodbc的安裝,作用是為了使用PIL的Image模組


接下來編寫程式碼就可以了:

import pyodbc
import io
from PIL import Image
#保密起見,這裡不給出我的伺服器ip地址,使用者和密碼了
#資料庫使用的是Sql Server 2008,因此driver填寫SQL Server Native Client 10.0,其他版本的sql請自行搜尋
conn = pyodbc.connect(r'DRIVER={SQL Server Native Client 10.0};SERVER=***.***.***.***,1433;DATABASE=zfzn02;UID=******;PWD=******')
cursor = conn.cursor()
cursor.execute("select * from accounts")

for row in cursor:
    data = row.photo #對應資料庫中的photo欄位
    account_code = row.account_code #對應資料庫的賬號欄位,也就是手機號
    print("saving " + account_code + " ...")
    image = Image.open(io.BytesIO(data))
    path = "photo\\" + account_code + ".png"
    image.save(path)

可以看到用python編輯的程式碼,是不是相當簡潔~

執行結果

這裡寫圖片描述
可以看到,每一個image欄位中的資料,都被我們匯出成了一張張png圖片,圖片的名字以account_code命名,這也方便了將來我們對圖片url的處理。