SQLite迁移至MySQL时Blob格式PNG图片批量导入方案咨询
可行实现方案
方案1:Python脚本批量导入(推荐,兼容性最高)
适合任意数据量,无需调整数据库配置,出错概率低:
- 先安装依赖包:
pip install pymysql - 修改以下脚本中的配置项后直接运行即可:
import os import pymysql # 以下配置项按实际情况修改 IMG_DIR = "/path/to/your/png/dir" # 导出PNG图片的存储目录 DB_CONFIG = { "host": "127.0.0.1", "port": 3306, "user": "你的MySQL用户名", "password": "你的MySQL密码", "db": "目标数据库名", "charset": "utf8mb4" } TARGET_TABLE = "你的目标表名" # 要插入Photo字段的表名 # 初始化数据库连接 db_conn = pymysql.connect(**DB_CONFIG) cursor = db_conn.cursor() try: processed_count = 0 # 遍历所有PNG文件 for file_name in os.listdir(IMG_DIR): if not file_name.lower().endswith(".png"): continue # 从文件名提取对应行ID(要求文件名格式为{ID}.png) row_id = os.path.splitext(file_name)[0] if not row_id.isdigit(): continue # 读取图片二进制内容 img_full_path = os.path.join(IMG_DIR, file_name) with open(img_full_path, "rb") as f: blob_content = f.read() # 执行更新写入 update_sql = f"UPDATE {TARGET_TABLE} SET Photo = %s WHERE id = %s" cursor.execute(update_sql, (blob_content, int(row_id))) processed_count += 1 db_conn.commit() print(f"导入完成,共处理{processed_count}条图片数据") except Exception as e: db_conn.rollback() print(f"导入出错已回滚,错误信息:{str(e)}") finally: cursor.close() db_conn.close()
方案2:MySQL原生命令导入(适合小批量数据)
无需编写代码,仅需执行SQL语句,但需要调整数据库配置:
- 先开启允许本地文件导入权限:执行SQL
SET GLOBAL local_infile = 1; - 确认所有PNG文件存放在MySQL
secure_file_priv配置指定的可读取目录下 - 批量生成更新语句执行,单条语句示例:
UPDATE 你的表名 SET Photo = LOAD_FILE('/完整路径/到/图片/1.png') WHERE id = 1;
可通过Excel、文本编辑器批量拼接所有ID对应的更新语句后,一次性执行即可。
迁移注意事项
- 提前备份MySQL目标表的全量数据,避免更新操作错误覆盖已有数据
- 确认MySQL目标表的Photo字段类型足够存储PNG:TINYBLOB最大255B、BLOB最大64KB、MEDIUMBLOB最大16MB、LONGBLOB最大4GB,通常PNG图片建议设为MEDIUMBLOB或LONGBLOB,避免写入时数据截断
- 写入完成后抽样校验:随机取几个ID,将数据库中Blob字段导出为PNG,和原文件比对MD5或直接打开验证是否正常
- 后续同类型项目建议优先将图片等静态文件存储到对象存储服务,数据库仅存储文件路径,可大幅降低跨数据库迁移的复杂度,同时数据库性能也会更好
内容的提问来源于stack exchange,提问作者bellamym
相关产品推荐
相关产品推荐

