Flask与SQLAlchemy绑定参数错误:base64二维码存入SQLite失败如何解决?
问题根源
- 核心报错原因:
owner_id字段传入了不支持的类型。你的Qrdb模型中owner_id被定义为Integer类型的外键,但你创建实例时直接传入了current_user用户对象,而非用户的id值,报错信息里参数列表的第三个值<User 1>就是这个用户对象,sqlite无法将对象存入整数字段,因此触发参数绑定错误。 - 隐性错误:提交事务的代码写法错误,你写的
db.session.commit没有加括号,仅为引用方法对象,不会实际执行提交操作。 - 潜在隐患:
qr_b64s字段设置的长度为10000,当二维码存储的内容较多时,base64编码后的字符串很容易超出长度限制,触发溢出报错。
修复方案
1. 调整入库业务逻辑
if request.method == 'POST': data = request.form.get('data') if len(data) < 1: flash('Data too short!', category='error') else: # owner_id传入用户id而非整个用户对象 new_qr = Qrdb(qr_b64s=codegen.enq(data), data=data, owner_id=current_user.id) db.session.add(new_qr) # 加括号执行提交操作 db.session.commit() print('Qr added to DB.')
2. 可选模型优化
将qr_b64s字段改为无长度限制的Text类型,避免后续出现长度溢出问题:
class Qrdb(db.Model): id = db.Column(db.Integer, primary_key=True) data = db.Column(db.String(10000)) # 替换String为Text适配长base64字符串 qr_b64s = db.Column(db.Text) date = db.Column(db.DateTime(timezone=True), default=func.now()) owner_id = db.Column(db.Integer, db.ForeignKey('user.id'))
替代实现思路
如果不想让长base64字符串占用过多数据库存储空间,也可以将生成的二维码图片保存在项目静态资源目录下,数据库仅存储图片的文件访问路径,读写性能更优,也不会出现字段长度适配问题。
内容的提问来源于stack exchange,提问作者init_1_asec
相关产品推荐
相关产品推荐

