SQLAlchemy:声明性 Mixin 类中的 getter/setter

2023-12-27

我正在尝试为我打算在数据库模式中使用的 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:映射器属性(即 deferred、column_property()、relationship() 等)必须在声明性 mixin 类上声明为 @declared_attr 可调用项。

我的代码几乎是 1:1 的副本SQLAlchemy 声明式教程 http://www.sqlalchemy.org/docs/orm/extensions/declarative.html#defining-synonyms,唯一的区别是属性/同义词是在 Mixin 类中声明的。将“@declared_attr”装饰器附加或添加到现有装饰器不会改变任何内容。

我该如何解决这种情况?


也许创造attr() as an @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))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQLAlchemy:声明性 Mixin 类中的 getter/setter 的相关文章

随机推荐