SQLAlchemy如何关联数据库中已存在的两个对象并写入关联表记录
问题原因&解决方案
1 先修正你代码里的已知错误
你目前的代码存在多处语法、拼写错误,是关联失败的核心原因:
- 关联表引用拼写错误:你定义的多对多关联表名为
facts_info,但Facts类的relationship中secondary参数错误写为了sachverhalt_info - 语法符号错误:
Info类的relationship参数之间错误使用了分号;,应改为逗号, - 类名引用不一致:你定义的存储文件的类名为
Info,但查询时错误写为了Infos - 查询代码括号未闭合:
select的包裹括号缺失右半部分,会导致查询返回结果异常 - 外键引用错误:
facts_info表关联Facts的外键指向的表名错误,Facts对应的表名为facts而非fact
2 修正后的完整操作代码
修正后的模型定义
facts_info = Table( "facts_info", Base.metadata, Column("fact_id", Integer, ForeignKey("facts.id"), primary_key=True), Column("info_id", Integer, ForeignKey("info.id"), primary_key=True) ) class Facts(Base): __tablename__ = "facts" id = Column(Integer, primary_key=True) fact = Column(String(500), nullable=False, unique=True) created_at = Column(DateTime) updated_at = Column(DateTime) # 修正secondary参数为正确的关联表名 info = relationship("Info", secondary=facts_info, back_populates="fact") class Info(Base): __tablename__ = "info" id = Column(Integer, primary_key=True) filename = Column(String(50)) format = Column(String(10)) # 修正分号为逗号 fact = relationship("Facts", secondary=facts_info, back_populates="info")
修正后的查询&关联操作
# 修正括号闭合、类名错误 old_fact = session.execute(select(Facts).where(Facts.fact == "foo")).scalars().first() old_info = session.execute(select(Info).where(Info.filename == "example.txt")).scalars().first() # 关联两个已存在的持久化对象 old_fact.info.append(old_info) # 若仍不生效可手动标记对象为脏状态,触发关联表更新 # session.add(old_fact) session.commit()
3 额外验证说明
如果修正后仍无法写入,可在commit前执行session.flush()查看生成的SQL语句,确认是否有对facts_info表的INSERT操作,排查是否存在事务未提交、权限不足等其他问题。
内容的提问来源于stack exchange,提问作者timbeckss
相关产品推荐
相关产品推荐

