SQLAlchemy中的通用查询

2024-10-03 15:26:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码:

class ArchaeologicalRecord(Base, ObservableMixin, ConcurrentMixin):
    author_id = Column(Integer, ForeignKey('authors.id'))
    author = relationship('Author', backref=backref('record'))

    horizont_id = Column(Integer, ForeignKey('horizonts.id'))
    horizont = relationship('Horizont', backref=backref('record'))

    .....

    somefield_id = Column(Integer, ForeignKey('somefields.id'))
    somefield = relationship('SomeModel', backref=backref('record'))

目前我有一个条目(作者或水平面或任何其他与建筑记录). 我要确保没有一个记录引用这个字段。但我不喜欢为每种情况编写大量代码,我想用最普通的方式来做。在

所以,实际上我有:

  • 考古记录实例
  • 子实体的实例,例如Horizont
  • (来自上一篇)这是类定义。在

如何在不编写大量复制粘贴代码的情况下检查ArchaeologicalRecord是否包含对Horizont(或任何其他子实体)的引用?在


Tags: 代码id记录情况columnintegerrecordauthor
1条回答
网友
1楼 · 发布于 2024-10-03 15:26:56

你在问如何找到孤儿作家,霍森茨,somefields等等?在

假设您的所有关系都是多对一(考古记录对作者),您可以尝试以下方法:

from sqlalchemy.orm.properties import RelationshipProperty
from sqlalchemy.orm import class_mapper

session = ... # However you setup the session

# ArchaelogicalRecord will have various properties defined, 
# some of these are RelationshipProperties, which hold the info you want

for rp in class_mapper(ArchaeologicalRecord).iterate_properties:  
    if not isinstance(rp, RelationshipProperty):
        continue

    query = session.query(rp.mapper.class_)\
            .filter(~getattr(rp.mapper.class_, rp.backref[0]).any())

    orphans = query.all()
    if orphans:
        # Do something...
        print rp.mapper.class_
        print orphans

当反向参考是None(即,在没有backref的情况下定义了一个关系)-在这种情况下,您可能需要更加手动地构造查询,但是RelationshipProperty和它的.mapper和。mapper.class\属性应该能让你以一种通用的方式获取你需要的所有信息。在

相关问题 更多 >