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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 02:00:00