使用Python Orator填充MySQL Blob字段时输出异常,如何解决?
问题分析与解决方案
首先拆解你遇到的两个现象:
- 返回码1:这其实是MySQL INSERT操作成功后返回的受影响行数,说明你的数据已经成功插入了1条记录,这是正常反馈,不是错误。
- 输出的字节流
0\x00\x00\x00...:大概率是你在代码中不小心打印了open('model.h5', 'rb').read()的结果,或者Orator的调试日志输出了参数中的二进制内容——这个不是异常,只是二进制数据的字符形式展示。
不过虽然没有抛出异常,还是要确保二进制数据被正确存储到Blob列中,以下是需要注意的修复点:
1. 安全读取二进制文件
直接使用open(...).read()可能会导致文件句柄泄漏,建议用with语句管理文件资源,同时把二进制数据存到变量中,避免误打印:
# 安全读取模型文件 with open('model.h5', 'rb') as model_file: classifier_file_data = model_file.read() # 执行插入 affected_rows = self.__db.insert( 'insert into `classifierinfo` (`Name`, `InputFormat`, `NumberOfClasses`, `Code`, `ClassifierFile`, `IDClassifierType`) VALUES (?, ?, ?, ?, ?, ?)', [ 'Классификатор изображений на базе датасета cifar10', '32 32', 10, 123, classifier_file_data, 1 ] ) # 这里的affected_rows就是返回的1,代表成功插入1条记录 print(f"成功插入 {affected_rows} 条记录")
2. 确认Blob列的类型足够存储模型文件
如果你的model.h5文件较大,要确保ClassifierFile列的类型不是TINYBLOB(最大仅255字节),根据文件大小选择:
MEDIUMBLOB:最大支持16MB数据LONGBLOB:最大支持4GB数据
如果列类型太小,数据会被静默截断(MySQL默认非严格模式下不会抛出异常),导致模型文件损坏。
3. 检查数据库驱动的兼容性
Orator通常依赖pymysql作为MySQL驱动,确保你的连接配置中没有禁用二进制数据支持。一般默认配置是没问题的,但如果遇到存储异常,可以在数据库连接参数中显式指定:
# 示例Orator数据库配置 DATABASES = { 'default': { 'driver': 'mysql', 'host': 'localhost', 'database': 'your_db', 'user': 'your_user', 'password': 'your_pass', 'charset': 'utf8mb4', # 确保字符集正确 'prefix': '' } }
4. 排查字节流输出的来源
如果你没主动打印二进制数据,检查是否开启了Orator的调试模式——调试模式下会输出SQL语句和参数内容,二进制参数会以字节形式展示。可以关闭调试模式或者过滤掉二进制参数的日志输出。
内容的提问来源于stack exchange,提问作者Semyon Kirekov
相关产品推荐
相关产品推荐

