AttributeError: у объекта 'unicode' нет атрибута '_sa_instance_state' - PullRequest
9 голосов
/ 04 сентября 2011

Я только учусь, как использовать SQLAlchemy.Я пытаюсь сделать следующее, но сохраняю заголовок и ссылку в двух отдельных таблицах:

temp = Submissions(title=u'Facebook Homepage', link=u'http://facebook.com')
session.add(temp)
session.flush()
transaction.commit()

via:

class Links(Base):
    __tablename__ = 'links'
    id = Column(Integer, primary_key=True)
    link = Column(Text)
    created = Column(TIMESTAMP(), default=datetime.now())

    def __init__(self, link):
        self.link = link

class Submissions(Base):
    __tablename__ = 'submissions'
    id = Column(Integer, primary_key=True)
    created = Column(TIMESTAMP(), default=datetime.now())
    title = Column(Text)
    link_id = Column(Integer, ForeignKey('links.id'))
    link = relation(Links)

    def __init__(self, title, link):  
        self.title = title
        self.link = link

Однако, я всегда получаю эту ошибку:

AttributeError: 'unicode' object has no attribute '_sa_instance_state'

Что происходит?Есть ли лучший способ закодировать это?

Ответы [ 2 ]

8 голосов
/ 04 сентября 2011

Вы не можете сделать это с relationship.

Вам нужно договориться о том, чтобы Link был каким-то образом найден.

Самое очевидное - это просто посмотреть прямо.

submission_link = session.query(Links) \
                         .filter(Links.link == u'http://facebook.com') \
                         .first()
if submission_link is None:
    submission_link = Links(link=u'http://facebook.com')
    session.add(submission_link)

submission = Submissions(title=u'Facebook Homepage', link=submission_link)
session.add(submission)
session.commit()

Вы также можете использовать гибридные атрибуты , чтобы получить что-то, что немного похоже на ваш пример,но это существенно более запутанный.

также, это relationship, relation устарело.

2 голосов
/ 05 сентября 2011

Я бы настроил отношение как один-к-одному (uselist=False) и добавил бы свойство, которое обернуло бы отношение link.Конфигурация SA будет выглядеть так, как показано ниже, и ваш код должен работать нормально, создавая, обновляя и удаляя ссылку.Вам может потребоваться настроить отношение для опции delete-orphan в cascade.

...
class Submissions(Base):
    __tablename__ = 'submissions'
    id = Column(Integer, primary_key=True)
    created = Column(DateTime(), default=datetime.now())
    title = Column(Text)
    link_id = Column(Integer, ForeignKey('links.id'))
    link_rel = relation(Links, backref=backref("_submission", uselist=False))

    def __init__(self, title, link=None):
        self.title = title
        self.link = link

    @property
    def link(self):
        return self.link_rel and self.link_rel.link

    @link.setter
    def link(self, value):
        if value is None:
            self.link_rel = None
        elif self.link_rel is None:
            self.link_rel = Links(value)
        else:
            self.link_rel.link = value
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...