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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 16:54:05