2011-09-03 15 views
9

Sto solo imparando come usare SQLAlchemy. Sto cercando di fare quanto segue, ma la memorizzazione di titolo e il link in due tabelle distinte:AttributeError: l'oggetto 'unicode' non ha attributo '_sa_instance_state'

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 

Tuttavia, ho sempre arrivare questo errore:

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

Cosa sta succedendo? C'è un modo migliore per codificare questo?

risposta

9

Non è possibile farlo con lo relationship.

È necessario predisporre lo Link per la ricerca in qualche modo.

Il più ovvio è quello di cercare direttamente.

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

È inoltre possibile utilizzare hybrid attributes per ottenere qualcosa che sembra un po 'più simile a tuo esempio, ma la sua sostanzialmente più contorto.

anche, è relationship, relation è deprecato.

+0

grazie, è esattamente ciò di cui avevo bisogno. –

+1

non dovrebbe essere 'session.add (submission)'? –

2

Vorrei configurare la relazione come one-to-one (uselist=False) e aggiungere una proprietà che avrebbe disposto la relazione link. La configurazione di SA dovrebbe apparire come sotto e il tuo codice dovrebbe funzionare bene, creando, aggiornando e cancellando il link. Potrebbe essere necessario configurare la relazione per l'opzione delete-orphan in un 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

non può andare avanti, ma ecco un ringraziamento. sfortunatamente sto separando i collegamenti perché l'elenco è attivo, non uno a uno. –

Problemi correlati