2012-02-01 6 views
19

simplificado, tengo la estructura siguiente clase (en un solo archivo):SQLAlchemy no puede encontrar un nombre de clase

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') 

me sale el siguiente error de esto:

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. 

No estoy seguro de cómo Python no puede encontrar la clase Item, ya que incluso cuando se pasa la clase, en lugar de que el nombre sea una cadena, obtengo el mismo error. He estado luchando por encontrar ejemplos de cómo hacer relaciones simples con SQLAlchemy, así que si hay algo bastante obvio aquí, me disculpo.

+1

Esta respuesta también puede ser útil: http://stackoverflow.com/questions/7478403/sqlalchemy-classes-across-files –

+0

Esta respuesta también puede ser útil: http://stackoverflow.com/a/4235691/232794 – Sardathrion

Respuesta

17

Todo esto resultó ser debido a la forma en que he configurado SQLAlchemy en Pyramid. Esencialmente debe seguir al this section al pie de la letra y asegurarse de utilizar la misma instancia declarative_base como la clase base para cada modelo.

Tampoco estaba vinculando un motor de base de datos a mi DBSession, que no te molesta hasta que intentes acceder a los metadatos de la tabla, lo que sucede cuando usas relaciones.

0

Además, aunque esto no se aplica al OP, para que cualquiera que aterrice aquí obtenga el mismo error, verifique que ninguno de los nombres de la tabla tenga guiones.

Por ejemplo, una tabla llamada "movie-genres" que luego se usa como secundaria en una relación SQLAlchemy generará el mismo error "name 'movie' is not defined", ya que solo se leerá hasta el guión. Cambiar a guiones bajos (en lugar de guiones) resuelve el problema.

Cuestiones relacionadas