67

次のコード:

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'

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

4

4 に答える 4

89

これは、インスタンスではなくクラスbarからアクセスしようとしているためです。このクラスには関連付けられたオブジェクトはありません。これは単なる sqlalchemy InstrumentedAttributeです。これがエラーが発生する理由です:FooBarFooBarFooBarbarbar

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

FooBar.bar.foo.namesqlalchemy クエリの外側に入力すると、同じエラーが発生します。

Foo解決策は、クラスを直接呼び出すことです。

ses.query(FooBar).join(Bar).join(Foo).filter(Foo.name == "blah")
于 2014-07-15T16:23:20.513 に答える
36

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

ses.query(FooBar).join(Foobar.bar).join(Bar.foo).filter(Foo.name == "blah")
于 2013-05-17T12:31:08.273 に答える
2

SQLAlchemy の関係を正しく構成しないと発生する可能性のある関連エラー:

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

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

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

へのid_namespace引数relationship()はまったく存在しないはずです。SQLAlchemy はそれを別の型の引数として解釈しようとしており、不可解なエラーで失敗しています。

于 2016-02-04T11:08:07.407 に答える