Подтвердить что ты не робот

SQLAlchemy не может найти имя класса

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

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, поэтому, если там что-то довольно очевидное, я приношу свои извинения.

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

если это класс подпакета, добавьте Item и Auction class к __init__.py в подпакете.