The following code:
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")
is giving me this error:
AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object associated with FooBar.bar has an attribute 'foo'
Any explanations, as to why this is happening, and guidance to how such a thing could be achieved?
This is because you are trying to access bar
from the FooBar
class rather than a FooBar
instance. The FooBar
class does not have any bar
objects associated with it--bar
is just an sqlalchemy InstrumentedAttribute. This is why you get the error:
AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object associated with FooBar.bar has an attribute 'foo'
You will get the same error by typing FooBar.bar.foo.name
outside the sqlalchemy query.
The solution is to call the Foo
class directly:
ses.query(FooBar).join(Bar).join(Foo).filter(Foo.name == "blah")