SQLAlchemy多对多关联表报UNIQUE constraint failed错误如何解决
问题原因
报错的核心原因是多对多关联表的复合主键配置错误。你当前仅为关联表的projects_url字段设置了primary_key=True,这会强制关联表中每个项目URL只能存在一条记录,所以同一个项目要关联第二个自由职业者时就会触发唯一约束报错。
需要修改的配置
1. 调整关联表的主键规则
让三个关联字段共同组成复合主键,修改后的关联表代码如下:
association_table = Table('association', Base.metadata, Column('projects_url', ForeignKey('projects.url', ondelete="CASCADE"), primary_key=True), Column('project_freelancer_url', primary_key=True), Column('project_freelancer_freel_url', primary_key=True), ForeignKeyConstraint( ('project_freelancer_url', 'project_freelancer_freel_url'), ('project_freelancer.url', 'project_freelancer.freel_url')), )
修改后只有当projects_url+project_freelancer_url+project_freelancer_freel_url三个值完全重复时才会触发唯一约束,符合多对多关系的业务逻辑。
2. 可选调整relationship的级联规则
你当前在两个模型的多对多关系上都配置了cascade="all, delete",如果你的业务逻辑仅需要删除项目/自由职业者时同步删除关联表的映射记录,不需要删除另一端的源表数据,可以将cascade调整为"save-update, merge",避免误删业务数据。
注意事项
修改完配置后需要重建数据库表,或者手动调整现有关联表的主键约束,旧的约束才会失效。
内容的提问来源于stack exchange,提问作者CodeCoder20
相关产品推荐
相关产品推荐

