web-dev-qa-db-ja.com

クエリ中の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):
    __table= "foo"
    id = Column(Integer, primary_key=True)
    name = Column(String, unique = True)

class Bar(Base):
    __table= "bar"
    id = Column(Integer, primary_key = True)
    foo_id = Column(Integer, ForeignKey("foo.id"))

    foo = relationship("Foo")


class FooBar(Base):
    __table= "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'

なぜこれが起こっているのか、そのようなことをどのように達成できるのかについての説明はありますか?

35

何が起こるかを技術的に説明することはできませんが、以下を使用してこの問題を回避できます。

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

私は同じエラー_Neither 'InstrumentedAttribute' object nor 'Comparator' has an attribute_を受け取っていましたが、私の場合、問題はモデルが内部プロパティ_model.query_を上書きするqueryという名前の列を含んでいたことでした。

その列の名前を_query_text_に変更することにしました。これでエラーがなくなりました。あるいは、_name=_引数をColumnメソッドに渡すと、うまくいきます:query = db.Column(db.TEXT, name='query_text')

1
tokenizer_fsj

SQLAlchemyの関係を誤って構成することによって発生する可能性がある関連エラー:

_AttributeError: Neither 'Column' object nor 'Comparator' object has an attribute 'corresponding_column'
_

私の場合、このような関係を誤って定義しました:

_namespace   = relationship(PgNamespace, id_namespace, backref="classes")
_

relationship()の_id_namespace_引数は、まったく存在しないはずです。 SQLAlchemyは、異なるタイプの引数として解釈しようとしていますが、不可解なエラーで失敗します。

0
qris