SQLAlchemy: получатель / установщик в декларативном классе Mixin - PullRequest
8 голосов
/ 28 апреля 2011

Я пытаюсь определить простые методы получения / установки для класса 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" к существующим декораторам ничего не меняет.

Как мне разрешить эту ситуацию?

1 Ответ

13 голосов
/ 28 апреля 2011

Возможно создать 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...