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

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获取该父母的所有孩子列表。

原代码的其他问题

  1. 类定义关键字应该用小写class,不是Class;
  2. Children类名建议改为Child(单数更符合ORM实例对应单条记录的逻辑);
  3. 原代码中ForeignKey语句存在语法错误(缺少闭合括号)。

内容的提问来源于stack exchange,提问作者j.thompson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 17:20:31