首页 > 技术文章 > python读取SQLServer数据库的image格式数据并导出为图片

wzhk009 2020-12-30 10:59 原文

本篇内容来自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的处理。

推荐阅读