【问题标题】:Sqlalchemy foreign key to a subset of polymorphic classesSqlalchemy 外键到多态类的子集
【发布时间】:2013-10-15 08:02:35
【问题描述】:

我正在使用 sqlalchemy 创建一个类似于图形的结构,以便有几种类型的节点和连接它们的链接。节点定义如下:

class Node(Base):
    __tablename__ = 'node'
    id = Column(Integer, primary_key=True)
    type = Column(Unicode)
    __mapper_args__ = {'polymorphic_on': type}

class InputNode(Node):
    __tablename__ = 'inputnode'
    id = Column(Integer, ForeignKey('node.id'), primary_key=True)
    __mapper_args__ = {'polymorphic_identity': 'input'}

class ThruNode(Node):
    __tablename__ = 'thrunode'
    id = Column(Integer, ForeignKey('node.id'), primary_key=True)
    __mapper_args__ = {'polymorphic_identity': 'thru'}

class OutputNode(Node):
    __tablename__ = 'outputnode'
    id = Column(Integer, ForeignKey('node.id'), primary_key=True)
    __mapper_args__ = {'polymorphic_identity': 'output'}

现在我想创建一个看起来像这样的Link 表:

class Link(Base):
    __tablename__ = 'link'
    input = Column(Integer, ForeignKey('node.id', where='type IN ("input", "thru")'))
    output = Column(Integer, ForeignKey('node.id', where='type IN ("thru", "output")'))

我正在努力解决的问题是如何处理其中的where 部分,因为正如我所写的那样,它在 sqlalchemy 中无效。我曾想过使用CheckConstraintForeignKeyConstraint,但我看不出它们中的任何一个实际上如何用于执行此操作。

【问题讨论】:

  • 有什么更新吗?
  • @jpmorin 没有。幸运的是,这个项目现在已经被搁置了,所以我不需要担心。但是,我认为真正的解决方案是使用像 neo4j 这样的 nosql 数据库。不过,我仍然想知道如何在 sqlalchemy 中完成它。

标签: python database-design orm sqlalchemy polymorphic-associations


【解决方案1】:

我没有尝试过,也不是这方面的专家,但这不应该有效吗?

class Link(Base):
__tablename__ = 'link'
input = Column(Integer, ForeignKey('thrunode.id'))
output = Column(Integer, ForeignKey('outputnode.id'))

首先我有另一个想法,也许你可以为 id 使用不同的名称,而不是使用这些名称,有点像:
而不是:

class InputNode(Node): __tablename__ = 'inputnode' id = Column(Integer, ForeignKey('node.id'), primary_key=True) __mapper_args__ = {'polymorphic_identity': 'input'}

这个:

class ThruNode(Node): [...] thrunode_id = Column(Integer, ForeignKey('node.id'), primary_key=True) [...]

然后:

class Link(Base):
__tablename__ = 'link'
input = Column(Integer, ForeignKey('node.thrunode_id'))
output = Column(Integer, ForeignKey('node.outputnode_id'))

我从这里sqlalchemy docs: declarative.html#joined-table-inheritance得到了这个想法

【讨论】:

  • 这限制了对 ThruNode 的输入,这不是我想要的。我想说它可以是 ThruNode 或 InputNode。
  • 我明白了。我没有意识到这一点。
  • 另一种可能是让thru节点继承自node,然后让输入节点和输出节点继承自thrunode。但也许我应该停止尝试回答我不太了解的问题......
猜你喜欢
  • 2015-10-02
  • 2019-11-24
  • 2012-05-13
  • 2014-04-16
  • 2018-07-20
  • 2012-03-02
  • 2018-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多