Finding all association proxies in a SQLAlchemy class
我知道一种从类A(从db.model继承)中获取所有正确的sqla列的简单方法——我可以在运行时执行A.__table__.columns。但是,A也有几个关联代理,我不知道如何获得这些代理的列表(不仅仅是在类的所有属性上运行)。有没有可能用sqla的inspect检查这个?
我使用的是python2.7和flask sqlachemy。
有一种使用运行时检查API的方法。有了它,你甚至不需要通过__table__戳入A的内部:
1 2 3
| from sqlalchemy import inspect
inspect(A).columns |
例如,对于关联代理的列表,可以执行以下操作
1 2 3 4
| from sqlalchemy.ext.associationproxy import ASSOCIATION_PROXY
proxies = [desc for desc in inspect(A).all_orm_descriptors
if desc.extension_type is ASSOCIATION_PROXY] |
all_orm_descriptors是InspectionAttr属性的集合,包括映射属性和扩展声明的属性。要区分扩展和非扩展,请检查InspectionAttr.extension_type常量属性。
- @埃弗里拉,谢谢,这帮了很大的忙!我对all_orm_descriptors不熟悉。然而,我必须解决的一个问题是,检查返回的关联代理对象是部分对象。我无法访问它们的大部分属性(如remote_attr或local_attr),因为我会得到一个错误声明:Class object expected, got 'None'.,我通过获取代理的名称,然后使用getattr来绕过它。还有什么建议吗?
- 如果在第一次通过模型类或实例访问AssociationProxy描述符对象之前尝试访问该对象的attr、remote_attr或local_attr,则会出现此错误。在类构造期间,描述符没有得到对它们绑定到的类的引用。相反,类和可能的实例在访问时传递给描述符的__get__方法,如执行the_proxy.__get__(None, A)。AssociationProxy实例似乎在第一次调用时存储了一个引用,之后您可以访问attr等。
- 请参见调用描述符,以了解关于它们如何执行它们的操作的更多详细信息。
- 感谢您再次澄清!我最终按照你的建议做了-打电话给desc.__get__(None, cls),这似乎很管用。