Я пытаюсь определить простые методы получения / установки для класса mixin, который я намерен использовать в своей схеме базы данных:
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 (т.е. deferred, column_property (), Relations () и т. Д.) Должны быть объявлены как вызовы @declared_attr для декларативных классов mixin.
Мой код - почти копия 1: 1 из Декларативного учебника по SQLAlchemy , с той лишь разницей, что свойство / синоним объявляется в классе Mixin. Добавление или добавление декоратора "@declared_attr" к существующим декораторам ничего не меняет.
Как мне разрешить эту ситуацию?