SQLAlchemy多对多关联出现ObjectDeletedError问题求助
问题根源
核心问题是MoneyManagementsResult和Strategy表未定义自增主键字段,SQLAlchemy无法自动生成主键值,导致commit后实例的id为None,后续操作关联关系时,ORM认为实例已被删除或不存在,触发ObjectDeletedError,同时缺失主键也会引发SAWarning提示主键无默认值。
正确解决方案
1. 补全实体表的主键定义
为两个实体表添加自增主键字段,这是解决问题的核心:
from sqlalchemy import Column, Integer, ForeignKey from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship Base = declarative_base() class MoneyManagementsResult(Base): __tablename__ = "money_managements_results" id = Column(Integer, primary_key=True, autoincrement=True) # 添加自增主键 strategies = relationship( "Strategy", secondary="strategy_mm_result", back_populates="mm_results" ) class Strategy(Base): __tablename__ = "strategies" id = Column(Integer, primary_key=True, autoincrement=True) # 添加自增主键 mm_results = relationship( "MoneyManagementsResult", secondary="strategy_mm_result", back_populates="strategies" ) class StrategyMMResult(Base): __tablename__ = "strategy_mm_result" strategy_id = Column(Integer, ForeignKey("strategies.id"), primary_key=True) mm_result_id = Column(Integer, ForeignKey("money_managements_results.id"), primary_key=True)
2. 优化关联操作代码
补全主键后,原代码可正常执行,也可简化为一次提交减少数据库交互:
# 创建实例并关联,一次提交完成 money_management_result = MoneyManagementsResult(...) money_management_result.strategies.append(strategy) session.add(money_management_result) session.commit()
3. 数据库迁移(若已有数据)
如果数据库中已存在相关表,需执行迁移操作添加主键:
- MySQL:执行
ALTER TABLE money_managements_results ADD COLUMN id INT AUTO_INCREMENT PRIMARY KEY;(同理处理strategies表) - PostgreSQL:执行
ALTER TABLE money_managements_results ADD COLUMN id SERIAL PRIMARY KEY; - 若使用Alembic等迁移工具,生成对应迁移脚本并执行即可。
原代码报错原因
- 无自增主键时,
session.commit()后MoneyManagementsResult实例的id仍为None,ORM无法追踪该实例对应的数据库行 - 后续执行
money_management_result.strategies.append(strategy)时,SQLAlchemy尝试更新中间表,但找不到关联的mm_result_id,因此判定实例已被删除,抛出ObjectDeletedError
内容的提问来源于stack exchange,提问作者unknown
相关产品推荐
相关产品推荐

