SQLAlchemy 一个映射类中的多个外键到同一主键

2023-11-24

我正在尝试设置一个 postgresql 表,该表有两个外键指向另一个表中的相同主键。

当我运行脚本时出现错误

sqlalchemy.exc.AmbigouslyForeignKeysError:无法确定关系 Company.stakeholder 上父/子表之间的联接条件 - 有多个外键路径链接这些表。指定“foreign_keys”参数,提供应被视为包含对父表的外键引用的列的列表。

这就是确切的错误SQLAlchemy 文档然而,当我复制他们提供的解决方案时,错误并没有消失。我可能做错了什么?

#The business case here is that a company can be a stakeholder in another company.
class Company(Base):
    __tablename__ = 'company'
    id = Column(Integer, primary_key=True)
    name = Column(String(50), nullable=False)

class Stakeholder(Base):
    __tablename__ = 'stakeholder'
    id = Column(Integer, primary_key=True)
    company_id = Column(Integer, ForeignKey('company.id'), nullable=False)
    stakeholder_id = Column(Integer, ForeignKey('company.id'), nullable=False)
    company = relationship("Company", foreign_keys='company_id')
    stakeholder = relationship("Company", foreign_keys='stakeholder_id')

我在这里看到过类似的问题,但是一些答案推荐一个使用primaryjoin但在文档中它指出你不需要primaryjoin在这个情况下。


尝试从foreign_keys中删除引号并使它们成为一个列表。来自官方文档Relationship Configuration: Handling Multiple Join Paths

0.8版本更改:relationship()可以解决之间的歧义 国外重点目标的基础上foreign_keys单独论证; 这primaryjoin在这种情况下不再需要争论。


下面的独立代码适用于sqlalchemy>=0.9:

from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship, scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine(u'sqlite:///:memory:', echo=True)
session = scoped_session(sessionmaker(bind=engine))
Base = declarative_base()

#The business case here is that a company can be a stakeholder in another company.
class Company(Base):
    __tablename__ = 'company'
    id = Column(Integer, primary_key=True)
    name = Column(String(50), nullable=False)

class Stakeholder(Base):
    __tablename__ = 'stakeholder'
    id = Column(Integer, primary_key=True)
    company_id = Column(Integer, ForeignKey('company.id'), nullable=False)
    stakeholder_id = Column(Integer, ForeignKey('company.id'), nullable=False)
    company = relationship("Company", foreign_keys=[company_id])
    stakeholder = relationship("Company", foreign_keys=[stakeholder_id])

Base.metadata.create_all(engine)

# simple query test
q1 = session.query(Company).all()
q2 = session.query(Stakeholder).all()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQLAlchemy 一个映射类中的多个外键到同一主键 的相关文章

随机推荐

  • 使用 ShouldBeEquivalentTo 时如何排除 IEnumerable 中所有项目的属性?

    在我的 NUnit FluentAssertions 测试中 我使用以下代码将从系统返回的复杂对象与参考对象进行比较 response ShouldBeEquivalentTo reference o gt o Excluding x gt
  • 让 JRebel 与“mvn tomcat:run”一起使用

    我想知道当我从命令行执行 mvn tomcat run 时是否有人可以指出让 JRebel 工作的方向 我可以让 JRebel 在我的 IDE IntelliJ IDEA 中工作 但在 IDE 中运行感觉有点笨重 当我运行测试时 我不喜欢在
  • 将终端光标返回到行首并启用换行

    我正在编写一个过滤器 在用于终端输出的管道中 有时需要 覆盖 刚刚发生的行 它的工作原理是将标准输入逐个字符地传递到标准输出 直到 n达到 然后调用特殊行为 我的问题是如何返回到行的开头 我首先想到的是使用 r或 ANSI 序列 033 1
  • SQL Server 存储过程初学者指南 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 请推荐一些带有快速指南的网
  • 什么是 .NET RIA 服务?

    有人可以简单地解释一下吗 它可以与非 Silverlight 客户端一起使用吗 基本上 NET RIA 服务是一个框架 它隐藏了网络管道逻辑以处理有线 RPC 并在客户端和服务器之间桥接代码 您可以将其视为客户端 服务器开发的 RAD 来自
  • 使用正则表达式验证 url [重复]

    这个问题在这里已经有答案了 我已经尝试了所有可能的方法来使用正则表达式进行 url 验证 但我没有得到任何 我需要的是网址可以是这样的 google com http google com https google com http www
  • 使用 Spring Boot 进行客户端证书身份验证

    我需要导入证书才能向 Spring Boot 应用程序中的外部服务发出 http 请求 我如何设置 Spring Boot 才能做到这一点 那里有很多信息 但我发现它们有点令人困惑 似乎我可能只需要创建类似 truststore jks 密
  • 如何获取树结构中节点的所有子节点? SQL查询?

    表 用户 列 用户 ID 姓名 经理 ID rows 1 nilesh 0 2 nikhil 1 3 nitin 2 4 Ruchi 2 如果我提供用户 ID 它应该列出所有向他报告的人员 如果我给 userId 2 它应该返回 3 4 这
  • GCC - 仅在特定函数上启用编译器标志

    在我正在从事的一个项目中 我正在尝试优化的大文件中有一个四重嵌套的 for 循环 我认为这会受益于使用 funroll all loops 展开的编译器 但是 当我将此标志添加到编译器时 它会展开文件其余部分的其他循环 并使整个程序运行得更
  • 如何查看节点安装的软件包版本?

    我正在调整 Apache 食谱以与 2 4 Apache 一起使用 Opscode Cookbook 目前失败 因为它正在生成带有 LockFile 关键字的 conf 文件 该关键字被排除在 Apache 2 4 关键字列表之外 我想制定
  • 哪些 C# 类型名称很特殊?

    在什么输入下是特殊名称返回真 根据我的简短研究 我发现属性访问器和运算符重载具有特殊名称 以及名称中包含下划线的任何类型 谁能给我完整描述类型名称特殊的情况 ECMA 335 中发布的 CLI 规范是此类信息的不错来源 在文档中搜索rtsp
  • 更改现有 Xcode 项目的 Git 存储库

    我从 Github 克隆了一个废弃的存储库 现在我希望能够将我的更改上传到私有存储库 以便其他人可以与我一起处理这些更改 不幸的是 由于我克隆了它而不是创建分支 所以 Xcode 正在尝试提交原始存储库 有没有办法更改提交的存储库 如果有
  • Swift 弱引用比强引用慢得多

    我正在用 Swift 构建一个物理引擎 在对引擎进行了一些最近的添加并运行基准测试后 我注意到性能大幅下降 例如 在下面的屏幕截图中 您可以看到 FPS 如何从 60 FPS 下降到 3 FPS FPS 位于右下角 最终 我将问题追溯到一行
  • C# Windows 窗体应用程序 - 从另一个线程和类更新 GUI?

    我进行了大量搜索 但似乎找不到与我的具体问题相关的任何内容 我希望能够从另一个类 SocketListener 更新我的 MainUI 表单 并且在其中我有一个处理网络的线程 clientThread 现在 我可以从网络线程运行简单的输出
  • Magento 中独立的读写数据库

    我在网上找不到任何关于如何为 Magento 配置两个独立数据库的示例 一个用于读取请求 一个用于写入请求 我认为这应该发生在 app etc local xml 中 但我不知道语法是什么 有人知道语法或者有博客文章的链接或者我的搜索没有找
  • 将大量 CSV 文件上传到 SQL Server 数据库

    我需要将大量 16GB 超过 65 万条记录 CSV 文件上传到 SQL Server 2005 数据库中的单个表 有人对执行此操作的最佳方法有任何指示吗 Details 我目前正在使用 C 控制台应用程序 NET Framework 2
  • 在 Google 路线上添加 InfoWindow

    我正在尝试向路线添加信息窗口 有很多在标记上的事件侦听器上添加 InfoWindow 的示例 但是我如何移动信息窗口以显示从一个标记到另一个标记的实际计划路线 之前已经有人尝试问过这个问题但没有回应 路线信息窗口 不管怎样 我做了很多谷歌搜
  • 设置 Team Foundation Server 2010 的用户权限

    我们已经成功安装了TFS 2010 但不知道如何设置用户权限 我们是小型项目 有五个开发人员 一名经理和一名秘书 每个开发者都自己负责一个或多个项目 我们与任何项目之间没有合作 我们希望每个人都能看到每个项目的所有代码 但只有那些负责代码的
  • Windows 中是否有相当于 linux 命令“perf stat”的命令?

    Windows 中是否有相当于 linux 命令 perf stat 的命令 例如查看前端停顿 缓存未命中和其他性能计数器数据 perf是仅限 Linux 的分析器 能够访问硬件事件计数器 缓存未命中 CPU 停顿等 该分析器支持许多 CP
  • SQLAlchemy 一个映射类中的多个外键到同一主键

    我正在尝试设置一个 postgresql 表 该表有两个外键指向另一个表中的相同主键 当我运行脚本时出现错误 sqlalchemy exc AmbigouslyForeignKeysError 无法确定关系 Company stakehol