Python 使用联接表继承时,将Mixin添加到每个子类表中

Python 使用联接表继承时,将Mixin添加到每个子类表中,python,sqlalchemy,pyramid,Python,Sqlalchemy,Pyramid,我有以下设置: class Attribute(object): a = Column(Integer) class Thing(Base, Attribute): b = Column(Integer) class Subthing(Thing): c = COlumn(Integer) 但是,Thing和Subthing都将具有属性mixin,这意味着它们都将具有在属性中指定的列: Thing: a | b Subthing: a | c 我只希望这些mixi

我有以下设置:

class Attribute(object):
    a = Column(Integer)

class Thing(Base, Attribute):
    b = Column(Integer)

class Subthing(Thing):
    c = COlumn(Integer)
但是,Thing和Subthing都将具有属性mixin,这意味着它们都将具有在属性中指定的列:

Thing: a | b
Subthing: a | c
我只希望这些mixin列出现在Thing中,而不是子内容中:

Thing: a | b
Subthing: c

这是可能的,还是我必须手动创建列和方法,而不是对每件事都使用mixin?

子项
根据继承的定义从父项获取
a
。如果您不希望该行为,则
子项
无法从该对象继承。一个可能的解决方案是引入另一个基类

class Attribute(object):
    @declared_attr # the actual syntax on SQLAlchemy for doing mixins
    def a(cls):
       return Column(Integer)

class BaseThing(Base):
    pass

class Thing(BaseThing, Attribute):
    b = Column(Integer)

class Subthing(BaseThing):
    c = Column(Integer)

然后子项只有列
c
,而Thing有
a
b

subting
根据继承的定义从父项获取
a
。如果您不希望该行为,则
子项
无法从该对象继承。一个可能的解决方案是引入另一个基类

class Attribute(object):
    @declared_attr # the actual syntax on SQLAlchemy for doing mixins
    def a(cls):
       return Column(Integer)

class BaseThing(Base):
    pass

class Thing(BaseThing, Attribute):
    b = Column(Integer)

class Subthing(BaseThing):
    c = Column(Integer)

然后子项只有列
c
,而东西有
a
,和
b
,我刚刚遇到了同样的问题。事实证明,如果在mixin类中使用
@declared\u attr
定义列,SQLAlchemy的行为正常。使用联接表继承时,直接在mixin中声明的列会泄漏到子类中。

我也遇到了同样的问题。事实证明,如果在mixin类中使用
@declared\u attr
定义列,SQLAlchemy的行为正常。使用联接表继承时,直接在mixin中声明的列会泄漏到子类中。

这是一种行为不一致性,是由于@declared_attr的行为慢慢偏离了仅针对“column copy”用例测试的行为契约而产生的。“column on mixin”最初的用例是将它平等地应用于所有继承类,但是@declared_attr(开发时间稍晚)没有采用这种行为,因此不一致

将“column copy”更改为仅对非子类生效是一种向后不兼容的行为更改,仅在即将发布的0.8中也是如此。这是2565号车票(http://www.sqlalchemy.org/trac/ticket/2565)并在r9baa197f2c67中解析

测试:


这是由于@declared_attr的行为慢慢偏离了仅针对“column copy”用例进行测试的行为契约而导致的行为不一致。“column on mixin”最初的用例是将它平等地应用于所有继承类,但是@declared_attr(开发时间稍晚)没有采用这种行为,因此不一致

将“column copy”更改为仅对非子类生效是一种向后不兼容的行为更改,仅在即将发布的0.8中也是如此。这是2565号车票(http://www.sqlalchemy.org/trac/ticket/2565)并在r9baa197f2c67中解析

测试:


这在我看来是完全正常的:子项继承自Thing,Thing继承自属性。为什么子处理会神奇地不从其父级继承?还有,它也从哪个“基”继承?在单表继承和联接表继承的情况下,它对我来说没有实际意义。属性将被无故覆盖。@Mel:
Base
是由
sqlalchemy.ext.declarative.declarative\u Base
返回的基类的惯用名称。这在我看来完全正常:子项是从Thing继承的,而Thing是从Attribute继承的。为什么子处理会神奇地不从其父级继承?还有,它也从哪个“基”继承?在单表继承和联接表继承的情况下,它对我来说没有实际意义。属性将被无故覆盖。@Mel:
Base
sqlalchemy.ext.declarative.declarative\u Base
返回的基类的常用名称。