SQLAlchemy не может найти имя класса - PullRequest
25 голосов
/ 01 февраля 2012

Упрощенно, у меня есть следующая структура класса (в одном файле):

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

Я получаю следующую ошибку из этого:

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.

Я не уверен, какPython не может найти класс Item, так как даже при передаче класса вместо имени в виде строки я получаю ту же ошибку.Я изо всех сил пытался найти примеры того, как сделать простые отношения с SQLAlchemy, поэтому, если здесь что-то совершенно очевидно не так, я прошу прощения.

Ответы [ 2 ]

22 голосов
/ 01 февраля 2012

Все это оказалось из-за того, как я настроил SQLAlchemy в Pyramid.По сути, вам нужно следовать этому разделу к букве и убедиться, что вы используете тот же экземпляр declarative_base, что и базовый класс для каждой модели.

Я также не привязывал механизм базы данных кmy DBSession, который вас не беспокоит, пока вы не попытаетесь получить доступ к метаданным таблицы, что происходит, когда вы используете отношения.

2 голосов
/ 18 августа 2017

Кроме того, даже если это не относится к OP, для любого приземляющегося здесь, получившего ту же ошибку, убедитесь, что ни в одном из имен ваших таблиц нет тире.

Например, таблица с именем «movie-genres», которая затем используется в качестве вторичного объекта в отношении SQLAlchemy, выдаст ту же ошибку "name 'movie' is not defined", поскольку она будет считываться только до тире. Переключение на подчеркивания (вместо тире) решает проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...