一、需求来源

近期,我们正在做数据迁移的工作。现目前的需求现状是:需将数据库材料表中所有的用户材料数据下载下来,做备份和下一步工作使用,这个任务便落在了我的头上。
我的任务是将每位用户的六张材料图下载下来,存在每个人单独的文件夹中 。

二、解题思路

在解题之前,需阐明,材料数据是完整base64字符(转化后其实就是一张张图片),数据量太大了,每次打开表都要打开半天,转换之前需将“data:image/png;base64,”替换掉。

1.excel导入方式

最开始的想法是,将我所需要的字段和图片字段通过excel导出,我再通过Python读取excel表格,在转换数据,形成一张张图片。结果表明base64字符太长了,excel上面根本无法操作,所以过了一会儿就放弃了

2.数据库连接方式

而后想起可以直接通过连接数据库的方式,读取材料表数据,最后进行转化。
代码如下(示例):

import base64
import time
import uuid

import pymysql
import os

file_path = r'D:\LawyerAttachment'
# 如果不存在上面的文件夹,则创建。
if not os.path.exists(file_path):
    os.makedirs(file_path)
    print("文件夹创建成功")

# 输入你的数据库连接地址、账户和密码以及数据库名称
db = pymysql.connect(host="", user="", passwd="", database="", charset='utf8')
print(db)
# 使用cursor()方法获取操作游标
cursor = db.cursor()

print("开始连接数据库" + time.time())
sql = """SELECT * FROM sys_organization_20220426"""
print("数据库查询完毕" + time.time())
try:
    # 执行sql语句
    cursor.execute(sql)
    # 提交到数据库执行
    db.commit()
    results = cursor.fetchall()
    for row in results:
   	    # row[]就是数据库库中的字段名
        name = row[5] # 用户姓名
        one = row[7]  # 第一张
        two = row[8]  # 第二张
        three = row[9]  # 第三张
        four = row[10]  # 第四张
        five = row[11]  # 第五张
        six = row[12]  # 第六张
        # 创建姓名+时间文件夹
        worker_path = file_path + "\\{}".format(name + uuid.uuid4().hex)
        if not os.path.exists(worker_path):
            os.makedirs(worker_path)
            print(name + "的文件夹创建成功了")
        else:
            print(name + "的文件夹已存在")
        # one = one.replace(' ', '+')
        if (one == "" or one == None):
            print(name + "图片为空")
        else:
            img_data1 = base64.b64decode(one)
            with open(worker_path + r'\1.png', 'wb') as f:
                f.write(img_data1)

        if (two == "" or two == None):
            print(name + "图片为空")
        else:
            img_data2 = base64.b64decode(two)
            with open(worker_path + r'\2.png', 'wb') as f:
                f.write(img_data2)

        if (three == "" or three == None):
            print(name + "图片为空")
        else:
            img_data3 = base64.b64decode(three)
            with open(worker_path + r'\3.png', 'wb') as f:
                f.write(img_data3)

        if (four == "" or four == None):
            print(name + "图片为空")
        else:
            img_data4 = base64.b64decode(four)
            with open(worker_path + r'\4.png', 'wb') as f:
                f.write(img_data4)

        if (five == "" or five == None):
            print(name + "图片为空")
        else:
            img_data5 = base64.b64decode(five)
            with open(worker_path + r'\5.png', 'wb') as f:
                f.write(img_data5)

        if (six == "" or six == None):
            print(name + "图片为空")
        else:
            img_data6 = base64.b64decode(six)
            with open(worker_path + r'\6.png', 'wb') as f:
                f.write(img_data6)
except Exception as e:
    # Rollback in case there is any error
    print("查询错误:", e)
    db.rollback()
db.close()


总结

做完之后才想到其实也可以用java完成该任务的,只怪我当时一心想到用Python去了。整个过程就查询数据库非常耗费之间,base64编码转图片的时候几乎就是几秒钟就完成了。
大概方法就是这样。
新手小白,刚上路,有许多知识不清楚,有许多的不足之处,还望大家多多指点一下我,谢谢啦。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐