You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python使用SQLAlchemy将PDF以Blob格式上传SQLite3实现咨询

代码调整方案

你当前的代码核心问题是未正确读取上传文件的二进制流,同时字段配置没有适配超大Blob的存储要求,调整步骤如下:

1. 表单配置(如果使用WTForms)

必须使用FileField接收上传文件,同时前端表单要设置enctype="multipart/form-data"属性,否则无法正常传输文件:

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
from flask_wtf.file import FileField, FileAllowed, FileRequired

class BookUploadForm(FlaskForm):
    author = StringField('作者', validators=[DataRequired()])
    title = StringField('书名', validators=[DataRequired()])
    pdf = FileField('PDF文件', validators=[
        FileRequired(),
        FileAllowed(['pdf'], '仅支持PDF格式文件')
    ])
    submit = SubmitField('上传')

2. 模型字段调整

SQLite本身支持最大2GB的Blob存储,将字段替换为LargeBinary适配大文件存储:

class Book(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    author = db.Column(db.String(50), unique=False)
    title = db.Column(db.String(50), unique=False)
    # 配置为最大2GB存储,可按需调整上限
    pdf = db.Column(db.LargeBinary(length=2*1024*1024*1024))

3. 视图函数调整

直接读取上传文件的二进制流赋值,不需要落地到本地磁盘:

# 提前配置Flask上传大小限制,和模型上限对齐
app.config['MAX_CONTENT_LENGTH'] = 2 * 1024 * 1024 * 1024

@app.route('/uploadStory', methods=['GET', 'POST'])
def uploadStory():
    form = BookUploadForm()
    if form.validate_on_submit():
        # 直接读取二进制内容,无本地存储步骤
        pdf_content = form.pdf.data.read()
        new_book = Book(
            author=form.author.data,
            title=form.title.data,
            pdf=pdf_content
        )
        db.session.add(new_book)
        db.session.commit()
        return "上传成功"
    return render_template('upload.html', form=form)

额外说明

如果你的业务场景中PDF文件普遍超过100MB,更推荐用文件系统存储文件、数据库存文件路径的方案,超大Blob会显著降低SQLite的查询性能,若必须全量存在数据库中,以上方案可满足需求。

内容的提问来源于stack exchange,提问作者syntacticsugar247

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 20:24:00