如何在SQLAlchemy中获取两个模型实例的关系信息?

时间:2017-08-24 17:06:50

标签: python sqlalchemy

我有一个项目,大约有20多个模型代表我的数据库中的表。他们中的一些人之间有关系,我希望能够从两个相关的实例中提取一些关系信息。例如,映射到另一个实例的主键的外键以及连接这两个实例的此键的值。

目前我试图通过inspect()[sqlalchemy.inspection]获取此信息/比较并获取与实例相关的Mapper:

instance_mapper = inspect(instance.__class__)

但无法在文档中找到确切的方法,这些方法将返回用于关系和键值的每种方法中的键。

为了更清楚:我想从两个表中获取创建关系的密钥,而不知道特定表的模式,但是有两个Mapper对象。

1 个答案:

答案 0 :(得分:1)

您可以检查RelationshipPropertylocal_columnsremote_sidelocal_remote_pairs属性。给出以下示例模型

In [2]: class A(Model): pass

In [3]: class B(Model):
   ...:     a_id = Column(Integer, ForeignKey('a.id'))
   ...:     a = relationship('A', backref='bs')
   ...:     

和一些连接在一起的示例实例,您可以检查B的实例,例如:

In [53]: mapper = inspect(b).mapper

In [54]: for rel in mapper.relationships:
    ...:     key = rel.key
    ...:     print('relationship', key, 'to', getattr(b, key))
    ...:     for lcl in rel.local_columns:
    ...:         local_key = mapper.get_property_by_column(lcl).key
    ...:         print(local_key, getattr(b, local_key))
    ...:         
relationship a to <__main__.A object at 0x7f8baf60b630>
a_id 1

如果您还要检查远程端,请使用remote_side属性,或使用local_remote_pairs一起检查它们。

请注意,如果您检查A的实例,则本地列是主键/唯一键,而远程键是外键列。