2017-03-30 6 views
0

Ich bin neu in SQLAlchemy und versuchen, ein ORM für eine vorhandene Datenbank einzurichten. Ich richte die Tabellen mit Metadaten ein und spezifiziere die Fremdschlüssel selbst. Die Tabelle Setup sieht wie folgt aus:SQLAlchemy Metadata-Beziehung mit mehreren Fremdschlüssel

class User(Base): 
    __table__ = Table('users', metadata, 
         Column('user_id', Integer, primary_key=True), 
         autoload=True) 

class Transaction(Base): 
    __table__ = Table('transaction', metadata, 
         Column('transaction_id', Integer, primary_key=True), 
         Column('seller_id', Integer, ForeignKey('users.user_id')), 
         Column('buyer_id', Integer, ForeignKey('users.user_id')), 
         autoload=True) 
    seller = relationship('User', foreign_keys=[seller_id]) 
    buyer = relationship('User', foreign_keys=[buyer_id]) 

Dies nicht ausgeführt wird, mit dem Fehler:

NameError: name 'seller_id' is not defined 

Jede Idee, was falsch ist?

Antwort

0

Um zu verstehen, warum Sie die Fehlermeldung erhalten Sie Ihr Verständnis auf class construction in Python auffrischen sollten:

When a class definition is entered, a new namespace is created, and used as the local scope — thus, all assignments to local variables go into this new namespace. In particular, function definitions bind the name of the new function here.

In Ihrem Beispiel haben Sie keine Zuordnungen zu seller_id, die den Namen einführen würden, und so ein Versuch zu verwenden, die Name während des Klassenaufbaus erhöht die NameError. Was Sie während des Klassenaufbaus im aktuellen Namespace verfügbar haben, ist die __table__, die Sie zugewiesen haben. In der Tat ist dieser genaue Anwendungsfall unter "Using a Hybrid Approach with __table__" dokumentiert:

Note that when the __table__ approach is used, the object is immediately usable as a plain Table within the class declaration body itself, as a Python class is only another syntactical block.

Mit anderen Worten greifen die Spalten durch das Objekt Table an den Namen gebunden __table__:

class Transaction(Base): 
    __table__ = Table('transaction', metadata, 
         Column('transaction_id', Integer, primary_key=True), 
         Column('seller_id', Integer, ForeignKey('users.user_id')), 
         Column('buyer_id', Integer, ForeignKey('users.user_id')), 
         autoload=True) 
    seller = relationship('User', foreign_keys=[__table__.c.seller_id]) 
    buyer = relationship('User', foreign_keys=[__table__.c.buyer_id]) 
Verwandte Themen