AttributeError при запросе: ни объект InstrumentedAttribute, ни 'Comparator' не имеют атрибута

Следующий код:

Base = declarative_base() engine = create_engine(r"sqlite:///" + r"d:\foo.db", listeners=[ForeignKeysListener()]) Session = sessionmaker(bind = engine) ses = Session() class Foo(Base): __tablename__ = "foo" id = Column(Integer, primary_key=True) name = Column(String, unique = True) class Bar(Base): __tablename__ = "bar" id = Column(Integer, primary_key = True) foo_id = Column(Integer, ForeignKey("foo.id")) foo = relationship("Foo") class FooBar(Base): __tablename__ = "foobar" id = Column(Integer, primary_key = True) bar_id = Column(Integer, ForeignKey("bar.id")) bar = relationship("Bar") Base.metadata.create_all(engine) ses.query(FooBar).filter(FooBar.bar.foo.name == "blah") 

дает мне эту ошибку:

 AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object associated with FooBar.bar has an attribute 'foo' 

Любые объяснения, почему это происходит, и руководство к тому, как это можно достичь?

3 Solutions collect form web for “AttributeError при запросе: ни объект InstrumentedAttribute, ни 'Comparator' не имеют атрибута”

Это связано с тем, что вы пытаетесь получить доступ к bar из класса FooBar а не к экземпляру FooBar . Класс FooBar не имеет никаких связанных с ним объектов bar. bar – это всего лишь sqlalchemy InstrumentedAttribute . Вот почему вы получаете сообщение об ошибке:

 AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object associated with FooBar.bar has an attribute 'foo' 

Вы получите ту же ошибку, набрав FooBar.bar.foo.name вне запроса FooBar.bar.foo.name .

Решение состоит в том, чтобы вызвать класс Foo напрямую:

 ses.query(FooBar).filter(Foo.name == "blah") 

Я не могу технически объяснить, что происходит, но вы можете обойти эту проблему, используя:

 ses.query(FooBar).join(Foobar.bar).join(Bar.foo).filter(Foo.name == "blah") 

Связанная ошибка, которая может быть вызвана неправильной настройкой отношений SQLAlchemy:

 AttributeError: Neither 'Column' object nor 'Comparator' object has an attribute 'corresponding_column' 

В моем случае я неправильно определил такие отношения:

 namespace = relationship(PgNamespace, id_namespace, backref="classes") 

Аргумент id_namespace для relationship() должен просто отсутствовать. SQLAlchemy пытается интерпретировать его как аргумент другого типа и с ошибкой с непостижимой ошибкой.

  • Выключить предупреждение в sqlalchemy
  • Python SqlAlchemy создает табличные классы прагматично
  • Правильный способ предотвратить повторение запросов SQLAlchemy на истекших объектах?
  • Flask и SQLAlchemy, приложение, не зарегистрированное в экземпляре
  • Каков хороший общий способ просмотра транзакций SQLAlchemy, в комплекте с аутентифицированным пользователем и т. Д.?
  • Недостаток метакласса SqlAlchemy
  • Повторный запрос Redshift + SQLAlchemy
  • sqlalchemy подключиться к серверу, не указывая базу данных
  •  
    Interesting Posts for Van-Lav

    используя pip для локального размещения пакетов, несмотря на удовлетворенные глобальные требования

    Как изменить представление функции Python?

    Необязательный аргумент в лямбда-функции

    Как использовать асинхронные методы?

    Как я могу отправить объект JSON из сценария Python в jQuery?

    Python усекает длинную строку

    REGEX отличается от PHP до Python

    Как fillna () со значением 0 после вызова resample?

    Доступ к массиву C struct к Python с помощью SWIG

    Pylint: отключить определенные предупреждения для определенной папки.

    Ошибка значения, пытающаяся установить расширения Python для Windows

    Как избежать Google Captcha с помощью PhantomJS (работающие частные прокси поймают его)

    Объединение диспетчера REST со значением по умолчанию в одном приложении CherryPy

    Как использовать модуль scrapy.log с пользовательским обработчиком журналов?

    учебник flaskr; не может импортировать flaskr (инициализировать базу данных)

    Python - лучший язык программирования в мире.