【问题标题】:sqlalchemy getting type of field for synonym and relationshipssqlalchemy 获取同义词和关系的字段类型
【发布时间】:2018-05-16 03:37:20
【问题描述】:

我有一个 SQL Alchemy ORM,其中有常规列、同义词和关系。

class Table1(Base):
   regular_field = Column("RegularField", Integer)
   field = Column("TestField", String)
   field_synonym = synonym('field')
   relation_type = relationship("Table2", back_populates="Table1")

当我使用会话从数据库中检索对象时,如何循环返回的对象并返回没有同义词的常规字段、跳过具有同义词的字段、同义词本身并跳过关系?所以对于上面的,它应该只返回

    regular_field, field_synonym

跳过

    field (since it has a synonym called field_synonym) 
    relation_type (which is a relationship).

我该怎么做?

【问题讨论】:

    标签: python orm sqlalchemy relationship synonym


    【解决方案1】:

    您不能单独在实例上执行此操作,您需要查看类属性才能使其工作。如果您在具有相同名称的类上查找属性,您可以检查type 或对类属性进行isinstance 检查。

    例如,假设您有一个 table1 实例

    >>> table1.__class__.regular_field.__class__.__mro__
    (sqlalchemy.orm.attributes.InstrumentedAttribute,
     sqlalchemy.orm.attributes.QueryableAttribute,
     sqlalchemy.orm.interfaces._MappedAttribute,
     sqlalchemy.orm.interfaces._InspectionAttr,
     sqlalchemy.orm.interfaces.PropComparator,
     sqlalchemy.sql.operators.ColumnOperators,
     sqlalchemy.sql.operators.Operators,
     object)
    

    然后您可以像这样检查特定的类

    field = table1.__class__.field_synonym
    if isinstance(field, sqlalchemy.orm.attributes.propertyProxy):
        # overwriting vars is bad style, just for illustration purposes!
        field = field.original_property
    

    【讨论】:

    • 感谢您的回答,有没有办法自省某个领域的同义词?我可以识别同义词,但不能识别它们的同义词。
    • 使用dir 函数查看在synonym(或任何其他)对象上定义了哪些属性。通过这种方式,您甚至可以找出内部的、未记录的方法/属性。使用它我发现propertyProxy 上有一个original_property 属性,它由synonym 实例化。目的地可能有一个 key 属性(与大多数 SQLAlchemy ORM 属性一样),它为您提供了它的名称。
    【解决方案2】:

    不知道同义词,但这里有一种方法可以检查对象属性是否为关系(取自this answer):

    table = Table1()
    mapper_prop = type(table).relation_type.property
    # Use getattr if you have a dynamic attribute name
    # mapper_prop = getattr(type(obj), key).property
    if isinstance(mapper_prop, RelationshipProperty):
        print('I am a relationship')
    

    【讨论】:

    • 您可以更详细地定义它
    • “定义得更详细”是什么意思?
    猜你喜欢
    • 2022-08-24
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    相关资源
    最近更新 更多