sqlalchemy、混入、外键和声明属性

12 投票
1 回答
10723 浏览
提问于 2025-04-18 12:44

我知道在声明带有外键的列时,在声明性混合类中需要使用 @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

1 个回答

18

每个模型必须有独特的orm属性。如果从一个混合类(mixin)直接应用同样的属性到每个子类,它们就会有相同的属性。基本的orm属性很容易复制,因为它们不依赖于其他的orm属性。对于更复杂的属性,使用一个带有@declared_attr的函数可以确保为每个子类创建一个新的实例。

在处理过程中,SQLAlchemy会为每个类调用每个声明的属性,并将结果分配给目标名称。这样,它可以确保复杂的映射在每个子类中都是独特且正确的。

可以查看文档,里面有这个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) ```

撰写回答