SQLAlchemy:在声明性Mixin类中实现getter/setter

2024-04-16 22:50:30 发布

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

我试图为一个mixin类定义简单的getter/setter方法,我打算在我的数据库模式中使用它:

from sqlalchemy import Column, Integer, create_engine
from sqlalchemy.orm import synonym, scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base, declared_attr

engine = create_engine('sqlite:///')
Base = declarative_base(bind=engine)
Session = scoped_session(sessionmaker(bind=engine))


class Mixin(object):
    _attr = Column('attr', Integer)

    @property
    def attr(self):
        return self._attr

    @attr.setter
    def attr(self, value):
        self._attr = value

    attr = synonym('_attr', descriptor=attr)


class DummyClass(Base, Mixin):
    __tablename__ = 'dummy'

    id = Column(Integer, primary_key=True)

Base.metadata.create_all()

if __name__ == '__main__':
    session = Session()
    testobj = DummyClass()
    session.add(testobj)
    testobj.attr = 42
    assert testobj.attr == 42

尝试运行此示例时,出现以下错误:

sqlalchemy.exc.InvalidRequestError: Mapper properties (i.e. deferred,column_property(), relationship(), etc.) must be declared as @declared_attr callables on declarative mixin classes.`

我的代码几乎是SQLAlchemy Declarative Tutorial的1:1副本,唯一的区别是属性/同义词是在Mixin类中声明的。将“@declared\u attr”装饰符附加或前置到现有的装饰器不会更改任何内容。在

我如何解决这种情况?在


Tags: fromimportselfbasesqlalchemysessioncreatecolumn
1条回答
网友
1楼 · 发布于 2024-04-16 22:50:30

也许创建attr()作为返回同义词的@declared_attr修饰类方法?在

class Mixin(object):

    _attr = Column('attr', Integer)

    def get_attr(self):
        return self._attr

    def set_attr(self, value):
         self._attr = value

    @declared_attr
    def attr(cls):
        return synonym('_attr', descriptor=property(cls.get_attr, cls.set_attr))

相关问题 更多 >