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

War es hilfreich?

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))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top