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

时间:2015-09-24 09:40:14

标签: python sqlalchemy polymorphism subquery anonymous

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

ChildAname列。

ChildBage列。

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()

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

这样的东西

1 个答案:

答案 0 :(得分:0)

如果我理解你想要做什么,你真的不需要子查询,它可能只是像

In [13]:

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

Pedro

对于子查询的使用,我建议您查看sqlalchemy tutorial

另一方面,我无法按照您的定义使用这些类,我不得不像这样添加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 docs

希望它有所帮助。