【问题标题】:How to get the relationship info for two model instances in SQLAlchemy?如何在 SQLAlchemy 中获取两个模型实例的关系信息?
【发布时间】:2017-08-26 02:16:06
【问题描述】:

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

目前我正在尝试通过 inspect() [sqlalchemy.inspection] 获取此信息/比较并获取与实例相关的映射器:

instance_mapper = inspect(instance.__class__)

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

为了更清楚:我想在不知道特定表的架构但拥有两个 Mapper 对象的情况下从两个表中获取创建关系的键。

【问题讨论】:

标签: python sqlalchemy


【解决方案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 的实例,则本地列是主键/唯一键,而远程列是外键列。

【讨论】:

  • 很好的答案,谢谢!只是为了确认其他事情。如果在 b 中,我对 a 的外键不称为 'a_id' 而是其他名称(例如:'to_a')
  • 内部for循环是使用关系中使用的本地列查找和访问实际外键列和映射属性的地方。那就是应该处理你的to_a。请注意,该列可能具有与映射属性不同的名称/键,因此是逐列查找。
猜你喜欢
  • 2012-09-10
  • 1970-01-01
  • 2015-11-16
  • 2019-06-15
  • 1970-01-01
  • 2022-06-11
  • 2013-11-06
  • 1970-01-01
  • 2019-03-25
相关资源
最近更新 更多