SQLAlchemy - создать экземпляр в других экземплярах __init__ - PullRequest
1 голос
/ 27 ноября 2011

Новичок в SQLAlchemy (поэтому моя терминология может быть немного неправильной). Я хочу создать объект базы данных внутри конструктора другого, но проблема в том, что я не могу добавить указанный объект в сеанс, поэтому я получаю ошибку.

Моя схема выглядит примерно так:

class Tag(Base):
    __tablename__ = 'tag'

    id = Column(Integer, Sequence('tag_id_seq'), primary_key=True, nullable=False)
    type = Column(String(1), nullable=False)
    name = Column(String(255), unique=True, nullable=False)

    def __init__(self, type, name):
        self.type=type
        self.name=name

    def __repr__(self):
        return "<Tag('%s')>" % (self.id)


class Venue:
    __tablename__ = 'venue'

    tag_id = Column(Integer)
    tag_type = Column(String(1), nullable=False)
    location = Column(String(255), nullable=False)

    tag = ForeignKeyConstraint(
            (tag_id, tag_type),
            (Tag.id, Tag.type),
            onupdate='RESTRICT',
            ondelete='RESTRICT',
            )

    def __init__(self,name,location):
        self.tag = Tag('V',name)
        self.location = location

Когда я делаю следующее:

session.add(Venue("Santa's Cafe","South Pole"))

Я получаю ошибку:

UnmappedInstanceError: Class '__builtin__.instance' is not mapped

Я предполагаю, что это потому, что объект Tag, созданный в конструкторе Venue, не добавляется в сеанс. Мой вопрос, как / когда я делаю это. (Я бы действительно предпочел создать этот объект Tag в конструкторе, если это возможно). Я думаю, что мог бы сделать это с помощью scoped_session, но это кажется очень плохим решением.

Спасибо

1 Ответ

2 голосов
/ 28 ноября 2011
  1. Наследовать Venue от Base. В противном случае Venue не будет отображено.
  2. Переместить ForeignKeyConstraint в __table_args__.
  3. Заменить в настоящее время бессмысленное свойство tag с relationship на Tag. Значение по умолчанию параметра cascade для relationship содержит правило 'save-update', которое добавляет новый упомянутый объект в тот же сеанс, что и родительский.

Из документации:

save-update - каскадная операция Session.add(). Этот каскад применяется как к будущим, так и к прошлым звонкам на add(), что означает новые предметы добавляется в коллекцию или скалярные отношения помещаются в то же сеанс как родительский, а также относится к элементам, которые имеют были удалены из этих отношений, но все еще являются частью история.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...