SQLAlchemy 无法连接两个表之间有两个外键

zer*_*dge 3 python sqlalchemy

owner_id = Column(Integer, ForeignKey('employees.employee_id'))由于Manager 类中的这一行,下面的代码不起作用。SQLAlchemy 生成错误消息:

AmbigeousForeignKeysError:无法确定“员工”和>“经理”之间的连接;表之间有多个外键约束关系。请明确指定此连接的“onclause”。

请帮忙解决这个问题!

这个想法是,每个经理都是一名员工,为某个所有者工作。可能有零个、一个或多个经理为所有者工作。

from sqlalchemy import (Table, Column, Integer, String, create_engine,
    MetaData, ForeignKey)
from sqlalchemy.orm import mapper, create_session
from sqlalchemy.ext.declarative import declarative_base

e = create_engine('sqlite:////tmp/foo.db', echo=True)
Base = declarative_base(bind=e)

class Employee(Base):
    __tablename__ = 'employees'

    employee_id = Column(Integer, primary_key=True)
    name = Column(String(50))
    type = Column(String(30), nullable=False)

    __mapper_args__ = {'polymorphic_on': type}

    def __init__(self, name):
        self.name = name

class Manager(Employee):
    __tablename__ = 'managers'
    __mapper_args__ = {'polymorphic_identity': 'manager'}

    employee_id = Column(Integer, ForeignKey('employees.employee_id'),
                         primary_key=True)
    manager_data = Column(String(50))

    owner_id = Column(Integer, ForeignKey('employees.employee_id'))


    def __init__(self, name, manager_data):
        super(Manager, self).__init__(name)
        self.manager_data = manager_data

class Owner(Manager):
    __tablename__ = 'owners'
    __mapper_args__ = {'polymorphic_identity': 'owner'}

    employee_id = Column(Integer, ForeignKey('managers.employee_id'),
                         primary_key=True)
    owner_secret = Column(String(50))

    def __init__(self, name, manager_data, owner_secret):
        super(Owner, self).__init__(name, manager_data)
        self.owner_secret = owner_secret

Base.metadata.drop_all()
Base.metadata.create_all()

s = create_session(bind=e, autoflush=True, autocommit=False)    
o = Owner('nosklo', 'mgr001', 'ownerpwd')
s.add(o)
s.commit()
Run Code Online (Sandbox Code Playgroud)

uni*_*rio 5

SQLAlchemy 对如何连接感到困惑,Manager因为Employee两个表之间有多个外键,employee_id并且owner_id。在这种情况下,您需要inherit_condition显式指定映射器:

class Manager(Employee):
    __tablename__ = 'managers'

    employee_id = Column(Integer, ForeignKey('employees.employee_id'),
                         primary_key=True)
    manager_data = Column(String(50))

    owner_id = Column(Integer, ForeignKey('employees.employee_id'))

    __mapper_args__ = {'polymorphic_identity': 'manager', 'inherit_condition': employee_id == Employee.employee_id}
Run Code Online (Sandbox Code Playgroud)