76 votes

SQLAlchemy ne peut pas trouver un nom de classe

Simplifié, j'ai la structure de classe suivante (dans un seul fichier) :

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

J'obtiens l'erreur suivante de ceci :

 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.

Je ne sais pas comment Python ne peut pas trouver la classe Item, car même en passant la classe, plutôt que le nom sous forme de chaîne, j'obtiens la même erreur. J'ai eu du mal à trouver des exemples de relations simples avec SQLAlchemy, donc s'il y a quelque chose d'assez évident qui ne va pas ici, je m'excuse.

26voto

mosi_kha Points 41

s'il s'agit d'une classe de sous-paquet, ajoutez la classe Item et Auction à __init__.py dans le sous-paquet.

5voto

Bob Rusovčev Points 41

J'ai résolu la même erreur en héritant d'un 'db.Model' au lieu de 'Base'... mais je fais le flacon

Par exemple:

 from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()


class someClass(db.Model):
    someRelation = db.relationship("otherClass")

4voto

Katie Byers Points 106

De plus, même si cela ne s'applique pas à l'OP, pour toute personne atterrissant ici ayant obtenu la même erreur, vérifiez qu'aucun de vos noms de table ne contient de tirets.

Par exemple, une table nommée "movie-genres" qui est ensuite utilisée comme secondaire dans une relation SQLAlchemy générera la même erreur "name 'movie' is not defined" , car elle ne lira que jusqu'au tiret. Le passage aux traits de soulignement (au lieu de tirets) résout le problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X