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

2023-12-02

由于这一行,下面的代码不起作用owner_id = Column(Integer, ForeignKey('employees.employee_id'))在经理班。 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()

SQLAlchemy 对如何加入感到困惑Manager to Employee因为两个表之间有多个外键,employee_id and 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}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQLAlchemy 无法连接两个表之间有两个外键 的相关文章

随机推荐

  • 用于验证 Excel 单元格的正则表达式

    我正在开发一个 php 应用程序 用户必须插入 Excel 的单元格 ID 例如A1 or AB32 一个存储在数据库中供以后使用的值 我正在尝试使用正则表达式验证单元格 ID 格式 但它似乎不起作用 这就是我到目前为止所得到的 a zA
  • 以 JSON 形式传递 javascript 代码

    我正在使用 jQuery 对 PHP 脚本进行 AJAX 调用 该脚本需要返回嵌入在 JSON 结果中的 javascript 代码 以便 jQuery 代码执行 如何以 JSON 格式传递 javascript 代码 两种方式 您必须将其
  • 如何在 d3.js 中创建“facetplot”?

    假设我有一个不同运动员的数据集 他们在不同的日子执行相同的测试 每天 他们都会进行几次试验 运行 我想使用 d3 js 可视化每个运动员这些天的发展 但我很难理解如何完成这项任务 在Python中使用seaborn或在R中使用ggplot2
  • 使用 omnet++ 查找内存分配错误

    我正在 omnet 和静脉 v2 0 rc1 下进行网络模拟 为此我实验了 4 个场景 每个场景都重复 20 次 在模拟第三个和第四个场景时 我遇到了一些错误 我猜这是一个内存分配错误 它们共享一个共同的功能 ack 对于相关模拟 它正常启
  • 浏览器关闭时的 Session_End 代码

    我有一个需要在 Session end 上运行的方法 有什么方法可以确保当用户关闭浏览器时代码运行 这可能是一个重复的问题 我看到一个响应调用了 ajax unload 或其他东西 但我不希望每次用户离开页面时 就在他们关闭浏览器时 都会触
  • 存储连接实例 -twisted.web

    如何在twisted web 中存储连接实例 我见过 request getSession 但我搜索了一下 很少有关于如何存储和检索它的示例 Thanks Update 我想将 LDAP 连接存储在会话中以便稍后检索 def render
  • PHP SoapClient 删除带有名称的元素

    我有一个 WSDL 其中有一个需要属性的元素
  • 对 Android 应用程序添加到的项目以外的项目进行 Firebase 身份验证

    我有一个非常具体的设置 其中我们有一个项目正在处理我们的身份验证 但另一个项目实际上将实际的 Android iOS 应用程序添加到项目中 当我们的自定义后端使用 auth 时 这很好 但是当我们尝试使用我们自己的提供程序时 我们会收到错误
  • XAMPP 缺少 php_eaccelerator_ts.dll

    在 php ini 中有这一行zend extension C xampp php ext php eaccelerator ts dll 并遵循本指南Win7 上的 XAMPP 太慢它说取消注释该行会使 XAMPP 更快 但如果该文件甚至
  • Google API 拒绝请求:具有引用限制的 API 密钥不能与此 API 一起使用

    我通过 Outsystems 平台进行 Google Map API REST 调用 但是 如果我在 Google 控制台中指定引荐来源网址 我的访问会被拒绝 但它是没有引荐来源网址的工作文件 为什么在使用 API 时在我的 Google
  • 从右到左工具提示文本c#

    使用 WinForms 我有一个想要设置到工具提示中的字符串 该字符串由以下行分隔Environment NewLine 像这样 x ToolTipText aaaaaa Environment NewLine bbb 当这个字符串设置为工
  • catch异常处理

    使用有什么区别 catch Exception ex throw ex 并使用 catch might include Exception throw throw ex从该点重新抛出异常对象 这通常是不好的 因为它破坏了导致原始问题的有用的
  • 通过将列表转换为集合然后再转换回列表来对列表进行排序的时间复杂度

    我最近看了Raymond Hettingers 谈论 Python 字典 并通过扩展集 他提到整数会散列到自身 并且将整数添加到字典 或集 将按顺序插入它们 只要您不删除项目 顺序就会是保存在 python 3 6 中 可能还有更高版本 在
  • 在ggplot2中格式化离散比例的位置

    我正在尝试在 GGPlot2 中创建格式良好的 2 状态凹凸图 在下图中 我想减小 y 轴和第一个因子值 旧 之间的 空白 的大小 并增加第二个值 新 右侧的空间大小 在真实数据中 我的文本是完整的句子 因此当前仅显示第一部分 My cod
  • MapOverlay 就像 PopUp 一样

    friends I want draw MapOverlay like as PopUp Menu same as in this image How I can do this 您可以使用或参考我为此目的创建的 MapViewBalloo
  • 将事件处理程序附加到谷歌地图信息气泡内的元素

    我有一个关于谷歌地图和事件处理 监听的问题 使用 jQuery 和谷歌地图 v3 我能够放置一个地图标记和一个事件侦听器 当用户单击该标记时 该事件侦听器会打开一个信息气泡 我想做的 但到目前为止还无法弄清楚 是将另一个事件处理程序添加到信
  • 如何加速 numpy 中的乘法和求和运算[重复]

    这个问题在这里已经有答案了 我需要解决有限元法问题并且必须计算以下内容C from A and B与一个大M M gt 1M 例如 import numpy as np M 4000000 A np random rand 4 M 3 B
  • 移动平均线或移动平均线

    Python 是否有 SciPy 函数或 NumPy 函数或模块可以计算给定特定窗口的一维数组的运行平均值 NOTE More efficient solutions may include scipy ndimage uniform fi
  • Postgres动态查询功能

    我需要创建一个函数来运行查询并返回结果 其中表名和列名作为函数的参数 我目前有这个 CREATE OR REPLACE FUNCTION qa scf tname character varying cname character vary
  • SQLAlchemy 无法连接两个表之间有两个外键

    由于这一行 下面的代码不起作用owner id Column Integer ForeignKey employees employee id 在经理班 SQLAlchemy 生成错误消息 AmbigeousForeignKeysError