2013-05-16 108 views
24

Các mã sau đây:AttributeError khi truy vấn: đối tượng Cả 'InstrumentedAttribute' cũng không 'sánh' có một thuộc tính

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") 

được đem lại cho tôi lỗi này:

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

Bất kỳ giải thích, là tại sao này đang xảy ra, và hướng dẫn làm thế nào một điều như vậy có thể đạt được?

Trả lời

31

Điều này là do bạn đang cố gắng truy cập vào bar từ lớp FooBar chứ không phải là một trường hợp FooBar. Lớp FooBar không có bất kỳ đối tượng bar nào được liên kết với nó - bar chỉ là một sqlalchemy InstrumentedAttribute. Đây là lý do bạn gặp lỗi:

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

Bạn sẽ gặp lỗi tương tự bằng cách nhập FooBar.bar.foo.name bên ngoài truy vấn sqlalchemy.

Giải pháp là để gọi lớp Foo trực tiếp:

ses.query(FooBar).filter(Foo.name == "blah") 
+11

Điều gì sẽ xảy ra nếu bảng có nhiều mối quan hệ với 'Foo' ? –

19

Tôi không thể giải thích về mặt kỹ thuật gì xảy ra nhưng bạn có thể làm việc xung quanh vấn đề này bằng cách sử dụng:

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

Bạn có thể hiểu tại sao nó hoạt động trong tài liệu: http://docs.sqlalchemy.org/en/rel_0_9/orm/tutorial.html#querying-with-joins –

0

Một lỗi liên quan có thể được gây ra bằng cách cấu hình mối quan hệ SQLAlchemy của bạn không đúng cách:

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

Trong trường hợp của tôi, tôi không đúng quy định một mối quan hệ như thế này:

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

Đối số id_namespace đối với relationship() chỉ nên không có ở đó. SQLAlchemy đang cố gắng diễn giải nó như là một đối số của một kiểu khác, và thất bại với một lỗi không thể hiểu được.

Các vấn đề liên quan