在表的子查询上创建ORM映射

时间:2016-07-28 20:17:22

标签: python orm sqlalchemy

我正在尝试在我有一对多表构造的情况下使用SQLAlchemy,但我基本上想要使用子查询在表之间创建一对一的映射。

例如

class User:
    __tablename__='user'
    userid = Column(Integer)
    username = Column(String)

class Address:
    __tablename__='address'
    userid = Column(Integer)
    address= Column(String)
    type= Column(String)

在这种情况下,Address的type列包含“Home”,“Work”等字符串。我希望输出看起来像这样

enter image description here

我尝试使用子查询,我尝试了

session.query(Address).filter(Address.type =="Home").subquery("HomeAddress")

然后加入反对,但后来我失去了ORM“实体”映射。

如何在查询结果对象中保留ORM属性?

1 个答案:

答案 0 :(得分:1)

您不需要使用子查询。连接条件不限于针对主键的外键:

home_address = aliased(Address, "home_address")
work_address = aliased(Address, "work_address")
session.query(User) \
       .join(home_address, and_(User.userid == home_address.userid,
                                home_address.type == "Home")) \
       .join(work_address, and_(User.userid == work_address.userid,
                                work_address.type == "Work")) \
       .with_entities(User, home_address, work_address)