You need to enable JavaScript to run this app. Flask+SQLAlchemy更新数据库字段时出现FileStorage类型报错
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.03 19:36:09