SQLAlchemy中同一列关联多外键的一对多映射问题
问题修正:实现父母与孩子的一对多关系
核心问题
你之前的代码把外键放反了——一对多关系的外键必须放在「多」的一侧(孩子表),而不是放在父表(父母表)里。把外键放在父母表的话,每个父母记录只能关联一个孩子ID,自然变成了一对一关系。
正确的表结构实现
from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship Base = declarative_base() class Mother(Base): __tablename__ = 'mother' id = Column(Integer, primary_key=True) # 定义一对多关系:一个母亲对应多个孩子,backref让孩子表自动拥有mother属性 children = relationship('Child', backref='mother') class Father(Base): __tablename__ = 'father' id = Column(Integer, primary_key=True) # 定义一对多关系:一个父亲对应多个孩子,backref让孩子表自动拥有father属性 children = relationship('Child', backref='father') class Child(Base): __tablename__ = 'child' id = Column(Integer, primary_key=True) # 外键关联母亲表的主键id mother_id = Column(Integer, ForeignKey('mother.id')) # 外键关联父亲表的主键id father_id = Column(Integer, ForeignKey('father.id')) # 可添加孩子的其他属性,比如姓名 name = Column(String(50))
逻辑说明
- 每个
Child实例通过mother_id/father_id关联到对应的Mother/Father实例,一个父母可以被多个孩子的外键指向,实现一对多。 - 通过
backref,你可以直接通过child.mother或child.father获取对应的父母实例,也可以通过mother.children或father.children获取该父母的所有孩子列表。
原代码的其他问题
- 类定义关键字应该用小写
class,不是Class; Children类名建议改为Child(单数更符合ORM实例对应单条记录的逻辑);- 原代码中
ForeignKey语句存在语法错误(缺少闭合括号)。
内容的提问来源于stack exchange,提问作者j.thompson
相关产品推荐
相关产品推荐

