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
相关产品推荐
相关产品推荐

