2010-04-12 2 views
5

Je suis assez nouveau à SQLAlchemy, ou même la programmation de base de données, peut-être ma question est trop simple. Maintenant, j'ai deux classes/table:Starter question de style déclaratif 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)) 

Bien sûr, il ne peut pas fonctionner. Ceci est le 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. 

Il y a deux clés étrangères en classe informatique, de sorte que la relation() ne peut pas déterminer appels que l'on doit être utilisé. Je pense que je dois utiliser des arguments supplémentaires pour le spécifier, non? Et comment? Merci

Répondre

10

La syntaxe correcte devrait être:

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

post-scriptum La prochaine fois s'il vous plaît préciser ce que vous voulez dire par "ne peut pas exécuter" en publiant un retraçage.

Mise à jour: le retraçage en question mise à jour dit exactement ce dont vous avez besoin: spécifier primaryjoin état:

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

merci pour vos conseils. La faute de frappe a été corrigée et Backtrace a été ajouté. – jfding

+0

merci, problème résolu. – jfding