SQLAlchemy在for循环中执行session.add()报主键重复错误如何解决
问题排查方向及解决方案
核心根因
你的主键UUID默认值配置错误,是导致重复主键报错的直接原因:
当前代码里主键列的配置为:
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4())
default=uuid.uuid4()带括号的写法,会在模型类首次加载时一次性生成固定的UUID值,后续所有新建的表实例都会复用这个固定值作为主键,因此第一条记录插入成功,第二条就触发主键唯一约束报错。
修复方案
把括号去掉,传入函数本身而非执行后的结果即可:
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
这样SQLAlchemy每次新建实例时都会主动调用uuid.uuid4()生成全新的唯一ID。
其他可优化/排查点
- 你当前把
db.session.commit()放在for循环内部,每次遍历单条记录就提交一次,既影响性能也容易导致事务碎片化,建议把commit移到for循环外部,所有记录处理完成后统一提交即可。 - 不需要每次
add后调用flush,flush仅会将会话改动同步到数据库但不提交事务,你当前每次循环都commit的场景下flush完全多余,可以直接删除。 - 排查近期是否有人修改过该模型类的主键配置,该逻辑之前可正常运行,大概率是之前的default写法不带括号,被误修改加了括号后才出现异常。
内容的提问来源于stack exchange,提问作者grommit
相关产品推荐
相关产品推荐

