2012-02-01 20 views
19

semplificato, ho la seguente struttura di classe (in un unico file):SQLAlchemy non riesce a trovare un nome di classe

Base = declarative_base() 

class Item(Base): 
    __tablename__ = 'item' 
    id = Column(BigInteger, primary_key=True) 
    # ... skip other attrs ... 

class Auction(Base): 
    __tablename__ = 'auction' 
    id = Column(BigInteger, primary_key=True) 
    # ... skipped ... 
    item_id = Column('item', BigInteger, ForeignKey('item.id')) 

    item = relationship('Item', backref='auctions') 

ottengo il seguente errore da questo:

sqlalchemy.exc.InvalidRequestError 
InvalidRequestError: When initializing mapper Mapper|Auction|auction, expression 
    'Item' failed to locate a name ("name 'Item' is not defined"). If this is a 
    class name, consider adding this relationship() to the Auction class after 
    both dependent classes have been defined. 

io non sono Certo in che modo Python non riesce a trovare la classe Item, in quanto anche quando si passa la classe, anziché il nome come stringa, ottengo lo stesso errore. Ho faticato a trovare esempi su come fare relazioni semplici con SQLAlchemy, quindi se c'è qualcosa di abbastanza ovvio in questo caso, mi scuso.

+1

Questa risposta potrebbe anche essere utile: http://stackoverflow.com/questions/7478403/sqlalchemy-classes-across-files –

+0

Questa risposta potrebbe anche essere utile: http://stackoverflow.com/a/4235691/232794 – Sardathrion

risposta

17

Tutto questo si è rivelato dovuto al modo in cui ho impostato SQLAlchemy su Pyramid. In sostanza, è necessario seguire this section alla lettera e assicurarsi di utilizzare la stessa istanza declarative_base come classe base per ciascun modello.

Non ero inoltre vincolante un motore di database per il mio DBSession che non ti infastidisce fino a quando non provi ad accedere ai metadati della tabella, cosa che accade quando usi le relazioni.

0

Inoltre, anche se questo non si applica all'OP, per tutti gli utenti che atterrano qui hanno ricevuto lo stesso errore, accertarsi che nessuno dei nomi delle tabelle presenti trattini.

Ad esempio, una tabella denominata "film-generi" che viene poi utilizzato come secondario in un rapporto SQLAlchemy genererà lo stesso errore "name 'movie' is not defined", perché sarà letto solo per quanto riguarda il cruscotto. Passare ai caratteri di sottolineatura (anziché ai trattini) risolve il problema.

Problemi correlati