0

我正在使用 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 中无效。我曾使用过 aCheckConstraint或 a ForeignKeyConstraint,但我看不出它们中的任何一个实际上如何用于执行此操作。

4

1 回答 1

0

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

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 文档中得到了这个想法:declarative.html#joined-table-inheritance

于 2014-06-03T13:32:51.033 回答