make - tree xpath python
AttributeError durante la consulta: ni el objeto ''InstrumentedAttribute'' ni el ''Comparator'' tienen un atributo (4)
Esto se debe a que está intentando acceder a la bar
desde la clase FooBar
lugar de una instancia de FooBar
. La clase FooBar
no tiene ningún objeto de bar
asociado a ella: la bar
es solo un atributo instrumentado sqlalchemy. Por eso te sale el error:
AttributeError: Neither ''InstrumentedAttribute'' object nor ''Comparator'' object associated with FooBar.bar has an attribute ''foo''
Obtendrá el mismo error al escribir FooBar.bar.foo.name
fuera de la consulta sqlalchemy.
La solución es llamar a la clase Foo
directamente:
ses.query(FooBar).filter(Foo.name == "blah")
El siguiente código:
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")
me esta dando este error
AttributeError: Neither ''InstrumentedAttribute'' object nor ''Comparator'' object associated with FooBar.bar has an attribute ''foo''
¿Alguna explicación sobre por qué está sucediendo esto y una guía sobre cómo podría lograrse tal cosa?
No puedo explicar técnicamente lo que sucede pero puede solucionar este problema utilizando:
ses.query(FooBar).join(Foobar.bar).join(Bar.foo).filter(Foo.name == "blah")
Recibía el mismo error. Neither ''InstrumentedAttribute'' object nor ''Comparator'' has an attribute
, pero en mi caso, el problema era que mi modelo contenía una columna llamada query
, que sobrescribía la propiedad interna model.query
.
Decidí cambiar el nombre de esa columna a query_text
y eso eliminó el error. Alternativamente, pasar el name=
argumento al método de Columna hubiera funcionado: query = db.Column(db.TEXT, name=''query_text'')
.
Un error relacionado que puede ser causado al configurar incorrectamente las relaciones de SQLAlchemy:
AttributeError: Neither ''Column'' object nor ''Comparator'' object has an attribute ''corresponding_column''
En mi caso, definí incorrectamente una relación como esta:
namespace = relationship(PgNamespace, id_namespace, backref="classes")
El argumento id_namespace
para relationship()
simplemente no debería estar allí. SQLAlchemy está tratando de interpretarlo como un argumento de un tipo diferente, y está fallando con un error inescrutable.