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

这是因为您试图barFooBar类而不是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通过在 sqlalchemy 查询之外键入,您将得到相同的错误。

解决方法是直接调用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 回答
5

我遇到了同样的错误Neither 'InstrumentedAttribute' object nor 'Comparator' has an attribute,但就我而言,问题是我的模型包含一个名为 的 Column query,它覆盖了 internal property model.query

我决定将该列重命名为query_text并删除了错误。或者,将name=参数传递给 Column 方法会起作用:query = db.Column(db.TEXT, name='query_text').

于 2018-07-23T17:55:33.340 回答
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 回答