2011-04-20 11 views
6

SqlAlchemy'ı Pylons içinde Sqlite veritabanı tabloları yapmak için kullanmaya çalışıyorum. Aşağıdaki kod ile tek seferde masa, sınıf ve mapper oluşturmak deklaratif tabanını kullanıyorum:SqlAlchemy: Kullanıcılar arasında bağlantılar oluşturmak, yani "arkadaşlar" yapmak

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) 

Sadece birine birçok gibi tüm farklı relationships, birçok birinden, bir yaklaşık öğreniyorum birine ve birçok kişiye ve her birini tablolarla ve/veya belirleyici bir şekilde nasıl uygulayacağınız. Merak ediyorum, bir nesneyi kendi ile nasıl ilişkilendirebilirim? Örneğin, facebook'ları diğer facebook'larla ilişkilendirmek istiyorum. Başka bir deyişle, aralarında bağlantı kurmak ve onları "arkadaş" olarak kurmak. Bunu mümkün kılmak için veritabanını nasıl yapılandırabilirim?

Düzenleme: Yukarıda güncellediğim kodu değiştirdim ve "Arkadaşlar" adlı bir ilişkilendirme nesnesi ekledim, ancak bir arkadaşa bir facebook nesnesini eklediğimde yalnızca bir yönde çalışıyor. Bob'u John'a bir arkadaş olarak eklerseniz, Bob'u John.Friends'da görebilirim, ama Bob'u. Neyi yanlış yapıyorum? Ben Arkadaşları sınıfında aşağıdaki ilişkiyi ekleyerek çalıştı:

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

ama bir hata alıyorum:

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.

cevap