sqlalchemy,mixin,foreignkeys和声明_

2024-10-03 15:26:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道在声明性mixin类上声明带有外键的列时需要@declared_attr,但是我想知道这背后的原因。在

谢谢:)

#store traces
class ListContainer():
        id = Column(Integer, primary_key=True)
        # timestamp = Column(DateTime, default=datetime.now())
        name = Column(String)
#endclass

#store flow in traces
def list_item(tablename):
        class ListItem():
#               @declared_attr
#               def trace_id(cls):
#                       return Column(Integer, ForeignKey(tablename+'.id'))
                trace_id = Column(Integer, ForeignKey(tablename+'.id'))
                id = Column(Integer, primary_key=True)
                item_pos = Column(Integer)
                # start_ea = Column(BLOB)
                # end_ea = Column(BLOB)
        #endclass
        return ListItem

Tags: storekeyidtrue声明defcolumninteger
1条回答
网友
1楼 · 发布于 2024-10-03 15:26:00

每个模型必须具有唯一的orm属性。如果mixin中的相同属性直接应用于每个子类,那么它们都将具有相同的属性。基本orm属性的副本很容易创建,因为它们不引用任何其他orm属性。对于更复杂的属性,用@declared_attr修饰的函数确保为每个子类创建一个新实例。在

在检测期间,SQLAlchemy为每个类调用每个声明的attr,并将结果分配给目标名称。通过这种方式,它可以确保复杂映射对于每个子类都是唯一正确的。在

请参见documentation,其中包括declared_attr示例:

from sqlalchemy.ext.declarative import declared_attr

class ReferenceAddressMixin(object):
    @declared_attr
    def address_id(cls):
        return Column(Integer, ForeignKey('address.id'))

class User(ReferenceAddressMixin, Base):
    __tablename__ = 'user'
    id = Column(Integer, primary_key=True) ```

相关问题 更多 >