如何修复sqlalchemy.exc.DataError: psycopg2字符串数据右截断报错
错误根因
- 直接触发报错的是
image字段长度不足:你当前模型中将存储图片二进制内容的image字段定义为db.String(100),最多仅支持存储100个字符,但你上传的PNG图片二进制内容长度超过133万字符,远超出字段最大长度限制,PostgreSQL校验不通过触发截断报错。 - 本地运行正常的原因:本地开发环境大概率使用SQLite数据库,SQLite对
VARCHAR类型的长度限制不做强制校验,超出定义长度的数据也可以正常写入;而Heroku上使用的PostgreSQL数据库会严格执行字段长度校验规则,因此触发报错。
修复方案
方案1:直接修改字段类型存储二进制内容(适合小体量应用)
将Ads模型中的image字段类型替换为适配大二进制内容的LargeBinary类型,无需设置长度限制:
class Ads(db.Model): # 其他字段保持不变,仅修改image字段定义 image = db.Column(db.LargeBinary)
修改完成后执行数据库迁移操作:
- 本地生成迁移脚本:
flask db migrate - 提交迁移脚本到代码仓库并部署到Heroku
- 在Heroku环境执行数据库升级:
heroku run flask db upgrade
方案2:存储图片到对象存储(更推荐,性能更好)
直接在数据库存储二进制文件会大幅降低数据库读写性能,数据量增长后很容易出现性能瓶颈,更推荐的做法是:
- 将上传的图片存储到第三方对象存储服务(如Cloudinary、阿里云OSS、七牛云等)
- 将
image字段改为存储图片的公网访问URL,字段类型调整为db.String(255)即可满足需求
额外注意
如果后续description字段需要存储更长的描述内容,也可以将其类型从db.String(100)修改为db.Text,避免后续出现同样的长度截断问题。
内容的提问来源于stack exchange,提问作者Kelvin Jones
相关产品推荐
相关产品推荐

