2010-04-12 16 views
5

SQLAlchemy konusunda oldukça yeniyim, hatta veritabanı programlama bile olabilir, belki benim sorum çok basit. Şimdi iki sınıf/tablo vardır:Beyanname stilinin Starter sorusu SQLAlchemy ilişkisi()

class User(Base): 
    __tablename__ = 'users' 
    id = Column(Integer, primary_key=True) 
    name = Column(String(40)) 
    ... 

class Computer(Base): 
    __tablename__ = 'comps' 
    id = Column(Integer, primary_key=True) 
    buyer_id = Column(None, ForeignKey('users.id')) 
    user_id = Column(None, ForeignKey('users.id')) 
    buyer = relation(User, backref=backref('buys', order_by=id)) 
    user = relation(User, backref=backref('usings', order_by=id)) 

Tabii ki, bu çalıştıramazsınız.

File "/Library/Python/2.6/site-packages/SQLAlchemy-0.5.8-py2.6.egg/sqlalchemy/orm/state.py", line 71, in initialize_instance 
    fn(self, instance, args, kwargs) 
    File "/Library/Python/2.6/site-packages/SQLAlchemy-0.5.8-py2.6.egg/sqlalchemy/orm/mapper.py", line 1829, in _event_on_init 
    instrumenting_mapper.compile() 
    File "/Library/Python/2.6/site-packages/SQLAlchemy-0.5.8-py2.6.egg/sqlalchemy/orm/mapper.py", line 687, in compile 
    mapper._post_configure_properties() 
    File "/Library/Python/2.6/site-packages/SQLAlchemy-0.5.8-py2.6.egg/sqlalchemy/orm/mapper.py", line 716, in _post_configure_properties 
    prop.init() 
    File "/Library/Python/2.6/site-packages/SQLAlchemy-0.5.8-py2.6.egg/sqlalchemy/orm/interfaces.py", line 408, in init 
    self.do_init() 
    File "/Library/Python/2.6/site-packages/SQLAlchemy-0.5.8-py2.6.egg/sqlalchemy/orm/properties.py", line 716, in do_init 
    self._determine_joins() 
    File "/Library/Python/2.6/site-packages/SQLAlchemy-0.5.8-py2.6.egg/sqlalchemy/orm/properties.py", line 806, in _determine_joins 
    "many-to-many relation, 'secondaryjoin' is needed as well." % (self)) 
sqlalchemy.exc.ArgumentError: Could not determine join condition between parent/child tables on relation Package.maintainer. Specify a 'primaryjoin' expression. If this is a many-to-many relation, 'secondaryjoin' is needed as well. 

sınıf Bilgisayar iki yabancı anahtarlar var, bu yüzden ilişki() callings biri kullanılması gerektiğini belirleyemez: Bu backtrace olduğunu. Bunu belirtmek için ekstra argümanlar kullanmalıyım, doğru mu? Ve nasıl? Teşekkür

cevap

10

doğru sözdizimi olmalıdır:

buyer = relation(User, backref=backref('buys', order_by=id)) 
user = relation(User, backref=backref('usings', order_by=id)) 

Not; Bir dahaki sefere lütfen bir traceback göndererek "çalıştırılamıyor" ile ne demek istiyorsunuz?

Güncelleme: güncellenen söz konusu traceback tam olarak neye ihtiyacınız diyor ki: Tavsiyenize

buyer = relation(User, primaryjoin=(buyer_id==User.id), 
       backref=backref('buys', order_by=id)) 
user = relation(User, primaryjoin=(user_id==User.id), 
       backref=backref('usings', order_by=id)) 
+0

sayesinde: primaryjoin koşulu belirtin. Yazım hatası düzeltildi ve backtrace eklendi. – jfding

+0

teşekkürler, sorun çözüldü. – jfding