繁体   English   中英

在sqlalchemy中如何访问子查询中的匿名字段

[英]In sqlalchemy how to access anonymous field in subquery

首先,我使用了Sqlalchemy的多态架构。 ChildAChildB扩展Child

ChildA具有name列。

ChildB具有age列。

class Parent(Base):
    __tablename__ = 'parent'

    id = Column(Integer, primary_key=True)

class Child(Base):
    __tablename__ = 'child'

    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey('parent.id'))
    parent = relationship(Parent, backref='children')

class ChildA(Child):
    __tablename__ = 'child_a'

    id = Column(Integer, primary_key=True)
    name = Column(String(50))

class ChildB(Child):
    __tablename__ = 'child_b'

    id = Column(Integer, primary_key=True)
    age = Column(Integer)


parent = DBSession.query(Parent).first()
subquery = parent.children.join(ChildA).subquery()

所以我想从subquery访问ChildA.name列。 类似于subquery.c.ChildA.name == 'Tom'

如果我正确理解了您要执行的操作,那么您实际上就不需要子查询,它可能只是类似

In [13]:

f = session.query(Parent, ChildA).join(ChildA).first()
print(f.ChildA.name)

Pedro

对于子查询的使用,我建议您看一下sqlalchemy 教程

另一方面,我无法使用您定义的类,因此必须添加一个ForeignKey

class ChildA(Child):
    __tablename__ = 'child_a'

    id = Column(Integer, ForeignKey('child.id'), primary_key=True)
    name = Column(String(50))

class ChildB(Child):
    __tablename__ = 'child_b'

    id = Column(Integer, ForeignKey('child.id'), primary_key=True)
    age = Column(Integer)

我毫不怀疑它对您有用,这可能取决于设置。

最后,我想建议您为孩子的类型使用一列。 这样,将更容易识别您正在使用的孩子。 像这样

class Child(Base):
    __tablename__ = 'child'

    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey('parent.id'))
    parent = relationship(Parent, backref='children')
    type = Column(String(20))

    __mapper_args__ = {
        'polymorphic_identity':'child',
        'polymorphic_on':type
    }

class ChildA(Child):
    __tablename__ = 'child_a'

    id = Column(Integer, ForeignKey('child.id'), primary_key=True)
    name = Column(String(50))

    __mapper_args__ = {
        'polymorphic_identity':'child_a',
    }

class ChildB(Child):
    __tablename__ = 'child_b'

    id = Column(Integer, ForeignKey('child.id'), primary_key=True)
    age = Column(Integer)

    __mapper_args__ = {
        'polymorphic_identity':'child_b',
    }

请查看sqlalchemy 文档以了解详细信息。

希望能帮助到你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM