我有一个项目,大约有20多个模型代表我的数据库中的表。他们中的一些人之间有关系,我希望能够从两个相关的实例中提取一些关系信息。例如,映射到另一个实例的主键的外键以及连接这两个实例的此键的值。
目前我试图通过inspect()[sqlalchemy.inspection]获取此信息/比较并获取与实例相关的Mapper:
instance_mapper = inspect(instance.__class__)
但无法在文档中找到确切的方法,这些方法将返回用于关系和键值的每种方法中的键。
为了更清楚:我想从两个表中获取创建关系的密钥,而不知道特定表的模式,但是有两个Mapper对象。
答案 0 :(得分:1)
您可以检查RelationshipProperty
的local_columns
,remote_side
和local_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
的实例,则本地列是主键/唯一键,而远程键是外键列。