2010-04-12 8 views
5

Ich bin ziemlich neu in SQLAlchemy oder sogar Datenbank-Programmierung, vielleicht ist meine Frage zu einfach. Jetzt habe ich zwei Klassen/Tabelle:Starter Frage des deklarativen Stils SQLAlchemy relation()

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

Natürlich kann es nicht laufen. Dies ist der Backtrace:

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. 

Es gibt zwei Fremdschlüssel in der Klasse Computer, so dass die Beziehung() callings nicht bestimmen kann, welche verwendet werden soll. Ich denke, ich muss zusätzliche Argumente verwenden, um es zu spezifizieren, richtig? Und wie? Dank

Antwort

10

Das sollte korrekte Syntax sein:

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

P. S. Beim nächsten Mal geben Sie bitte an, was Sie mit "Kann nicht ausführen" meinen, indem Sie eine Traceback-Nachricht senden.

aktualisieren: die Zurückverfolgungs in Frage aktualisiert sagt genau das, was Sie brauchen: angeben primaryjoin Zustand:

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

Dank für Ihre Beratung. Der Tippfehler wurde behoben und Backtrace wurde angehängt. – jfding

+0

Danke, Problem gelöst. – jfding