1

我不确定标题是否正确,所以让我举个例子

说我有TableATableB班,和History班。

History只是id, attribute, old value, new value

每个 Table 都将与 具有多对多关系History

显然我可以创建一个tablea_historytableb_history表来跟踪关系。

但是,我将有 5-10TableA/B个类型的表和 3-4 个History类型的表,这样就可以增加相当多的简单关系表。可以吗?(在管理和效率方面?)这似乎会增加很多额外的代码。

我也可以History定义 byid, table_name, attribute, old, new但我不知道如何创建好的 SQLAlchemy 关系。

TL;博士

我想我在问将子表与多种(不同类)父表相关联的最佳方法是什么,这让我不必担心幕后的东西,而只需使用良好的 SQLalchemy 关系。

4

1 回答 1

0

所以这就是我决定的。我不确定它是否是最有效的,但它似乎应该是......请注意,Event它将是History并且Device将会是TableA/B

您可以使用像这里这样的 Mixin来轻松地将关系添加到所有表中。然后你可以修改relationship()的 primaryjoin 属性以按表过滤。示例代码:

class Event(Base):

    #tablename
    type = Column(Unicode(50), nullable=False, index=True)
    #foreign id
    table_id = Column(Integer, nullable=False, index=True)
    attr = Column(Unicode(50), nullable=False)
    old = Column(Unicode(50), nullable=False)
    new = Column(Unicode(50), nullable=False)

class MetadataMixin(object):
    @declared_attr
    def events(cls):
        joinstr = '{0}.id == foreign(Event.table_id) and Event.type == "{1}"'.format(cls.__name__, cls.__tablename__)
        return relationship('Event', primaryjoin=joinstr, backref=cls.__name__.lower())

现在我们可以使用它:

class Device(MetadataMixin, Base):
    pass

>>> d = Device()
>>> d.events
[]

在接受这个答案之前,我将把这个问题留待一段时间,看看是否有人提出了更好的答案。

于 2013-08-19T05:18:35.350 回答