Starter Frage der deklarativen Stil SQLAlchemy Beziehung ()
-
26-09-2019 - |
Frage
Ich bin ganz neu in SQLAlchemy oder sogar Datenbankprogrammierung, vielleicht meine Frage ist zu einfach. Jetzt habe ich zwei Klassen / Tabelle:
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.
Da ist zwei Fremdschlüssel in der Klasse Computer, so dass die Beziehung () callings nicht bestimmen kann, welche verwendet werden soll. Ich glaube, ich zusätzliche Argumente verwenden, muss er angeben, nicht wahr? Und Howto? Dank
Lösung
Die richtige Syntax sollte sein:
buyer = relation(User, backref=backref('buys', order_by=id))
user = relation(User, backref=backref('usings', order_by=id))
P. S. Das nächste Mal bitte angeben, was Sie meinen durch „kann nicht ausgeführt werden“ durch eine Rückverfolgung zu veröffentlichen.
Aktualisieren : die Zurückverfolgungs in Frage aktualisiert sagt genau das, was Sie brauchen: primaryjoin
Zustand angeben:
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))