2011-09-03 21 views
9

SQLAlchemyの使い方を学んでいます。しかし、私はいつもこのエラーが出るAttributeError: 'unicode'オブジェクトに '_sa_instance_state'属性がありません

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 

:私は、次の操作を実行しようとしているが、二つの別々のテーブルにタイトルとリンク格納しています:経由

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

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

何が起こっている?これをコード化する良い方法はありますか?

答えて

9

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() 

また、もう少しあなたの例のように見える何かを得るためにhybrid attributesを使用しますが、その実質的に複雑なことができます。

また、relationship,は推奨されていません。

+0

ありがとう、ちょうど私が必要としたものです。 –

+1

は 'session.add(submission)'であってはなりませんか? –

2

one-to-oneuselist=False)という関係を設定し、link関係をラップするプロパティを追加します。 SAの設定は以下のようになり、コードはリンクの作成、更新、削除をうまく機能するはずです。 オプションを持つ関係を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 
... 
+0

はupvoteできませんが、ここに感謝します。残念ながら、リストは1対1ではないので、私はリンクを分けています。 –

関連する問題