Flask+SQLAlchemy更新数据库字段时出现FileStorage类型报错
报错根因
Flask的request.files接口返回的是FileStorage类封装的文件流对象,并非SQLAlchemy LargeBinary字段要求的原生bytes类型。SQLAlchemy执行UPDATE语句做参数类型校验时,无法将FileStorage对象转换为数据库可识别的二进制流,最终触发memoryview: a bytes-like object is required的类型不匹配报错。
修复实现
- 调用
FileStorage对象内置的read()方法,即可将上传的文件内容直接转换为标准bytes对象,完全匹配LargeBinary字段的存储要求。 - 触发报错的错误写法:
file_record.content = request.files['content'] - 修复后的正确赋值写法:
file_record.content = request.files['content'].read() - 注意事项:
FileStorage的读取流是一次性的,如果后续需要做文件大小、内容校验等逻辑,需将读到的bytes存入临时变量复用,避免重复调用read()方法读到空内容。参考代码片段:@app.post('/upload/<int:id>') def upload_file(id): record = FileContents.query.get_or_404(id) uploaded_file = request.files['content'] # 一次性读取为bytes对象 file_binary = uploaded_file.read() # 基于读到的内容做校验,比如限制10MB以内 if len(file_binary) > 10 * 1024 * 1024: return "文件大小超出允许范围", 400 record.content = file_binary db.session.commit() return "文件上传成功"
场景提示:如果应用需要上传大体积文件,不建议直接将全量二进制内容存入SQLite的LargeBinary字段,会导致数据库快速膨胀、查询性能下降,更适合将文件存储在本地磁盘或专用对象存储,数据库仅保存文件的访问路径。
内容的提问来源于stack exchange,提问作者Zhan Yessenzholov
相关产品推荐
相关产品推荐

