2011-04-20 14 views
6

Estoy tratando de usar SqlAlchemy para hacer tablas de bases de datos Sqlite dentro de Pylons. Estoy usando la base declarativa para crear la tabla, clase y asignador de todos a la vez con el siguiente código:SqlAlchemy: Cómo crear conexiones entre usuarios, es decir, crear "amigos"

class Friends(Base): 
    __tablename__ = 'friends' 
    left_id = Column(Integer, ForeignKey('facebooks.id'), primary_key=True) 
    right_id = Column(Integer, ForeignKey('facebooks.id'), primary_key=True) 

    def __repr__(self): 
     return "<Friend(id:'%s' id: '%s')>" % (self.left_id, self.right_id) 

class Facebook(Base): 
    __tablename__ = 'facebooks' 

    id = Column(Integer, primary_key=True) 
    friends = relationship("Facebook", 
          secondary=Friends.__tablename__, 
          primaryjoin= id == Friends.right_id, 
          secondaryjoin= Friends.left_id == id)  

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

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

sólo estoy aprendiendo sobre todos los diferentes relationships como muchos a uno, uno a muchos, uno a uno, y muchos a muchos y cómo implementar cada uno con tablas y/o de manera declarativa. Me pregunto, ¿cómo puedo asociar un objeto consigo mismo? Por ejemplo, quiero asociar facebooks con otros facebook. En otras palabras, para construir conexiones entre ellos y establecerlos como "amigos". ¿Cómo estructuraría la base de datos para que esto sea posible?

Editar: Cambié el código, que he actualizado anteriormente, y he agregado un objeto de asociación llamado "Amigos", pero cuando agrego un amigo a un objeto de Facebook, solo funciona en una dirección. Si agrego a Bob como amigo a John, puedo ver a Bob en John.Friends, pero no puedo ver a John en Bob.Friends. ¿Qué estoy haciendo mal? He intentado añadir la siguiente relación en la clase Amigos:

friend = relationship("Facebook", backref="friends") 

pero me da un error:

sqlalchemy.exc.ArgumentError: Could not determine join condition between parent/child tables on relationship Friends.friend. Specify a 'primaryjoin' expression. If 'secondary' is present, 'secondaryjoin' is needed as well.

Respuesta

Cuestiones relacionadas