首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >遗传后sqlalchemy.exc.AmbiguousForeignKeysError

遗传后sqlalchemy.exc.AmbiguousForeignKeysError
EN

Stack Overflow用户
提问于 2016-10-18 14:12:00
回答 2查看 2.2K关注 0票数 3

我使用sqlacodegen从我的数据库中反射一堆表。我得到了以下错误:

sqlalchemy.exc.AmbiguousForeignKeysError:无法确定'Employee‘和’Sales‘之间的连接;表之间有多个外键约束关系。请显式指定此联接的“on子句”。

这是我的表的简化版本。我在文档中看到,我应该使用foreign_keys参数来解决外键目标之间的歧义。虽然,我认为这个问题是因为继承。谁能帮我弄清楚这是怎么回事。

代码语言:javascript
复制
# coding: utf-8
from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship

Base = declarative_base()


class Employee(Base):
    __tablename__ = 'Employee'

    EmployeeId = Column(Integer, primary_key=True)


class Sales(Employee):
    __tablename__ = 'Sales'

    EmployeeID = Column(ForeignKey('Employee.EmployeeId'), primary_key=True)
    OldemployeeID = Column(ForeignKey('Employee.EmployeeId'))
    employee = relationship('Employee', foreign_keys=[EmployeeID])
    old_employee = relationship("Employee", foreign_keys=[OldemployeeID])
EN

回答 2

Stack Overflow用户

发布于 2018-11-22 16:52:40

当表之间有多个可能继承的路径(Sales.EmployeeIDSales.OldEmployeeID)时,SqlAlchemy不知道要使用哪个路径,需要使用inherit_condition显式地告诉它路径。例如,要由EmployeeID继承

代码语言:javascript
复制
class Sales(Employee):
    ...
    __mapper_args__ = { "inherit_condition": EmployeeID == Employee.EmployeeId }

例如,您还可以通过输入OldEmployeeID继承OldEmployeeID == Employee.EmployeeId --这意味着您的Sales主键和Employee主键都允许不同。

票数 1
EN

Stack Overflow用户

发布于 2016-10-19 10:34:36

只需在EmployeeID和OldemployeeID上使用backref和Integer即可。否则,您将得到另一个错误。

代码语言:javascript
复制
class Sales(Employee):
    __tablename__ = 'Sales'

    EmployeeID = Column(Integer, ForeignKey('Employee.EmployeeId'), primary_key=True)
    OldemployeeID = Column(Integer, ForeignKey('Employee.EmployeeId'))
    employee = relationship('Employee', foreign_keys=[EmployeeID], backref='Employee')
    old_employee = relationship("Employee", foreign_keys=[OldemployeeID], backref='Employee')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40110574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档