SQLAlchemy-返回过滤后的表和相应的外部表值

时间:2019-03-07 22:10:36

标签: python sql sqlalchemy

我有以下SQLAlchemy映射的类:

class ShowModel(db.Model):
    __tablename__ = 'shows'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100))    
    episodes = db.relationship('EpisodeModel', backref='episode', lazy='dynamic')

class EpisodeModel(db.Model):
    __tablename__ = 'episodes'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(200))
    show_id = db.Column(db.Integer, db.ForeignKey('shows.id'))
    info = db.relationship('InfoModel', backref='episode', lazy='dynamic')

class InfoModel(db.Model):
    __tablename__ = 'info'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100))
    episode_id = db.Column(db.Integer, db.ForeignKey('episodes.id'))

我正在尝试并且无法弄清楚如何执行查询来在info表中搜索特定的name列值,然后返回shows和{{1} }与之关联的表行。

使用以下查询,我可以返回与episodes查询匹配的特定info

filter_by(name=name)

但是我真的很难弄清楚如何也获得与特定InfoModel.query.filter_by(name=name).all())) 行有关系的相应外键行的值。是否有使用join语句或类似方法执行此操作的正确方法?非常感谢您对此提供的任何帮助,因为我仍在努力摆脱使用SQL数据库以及一般数据库的烦恼。

编辑-

例如,如果我使用查询info,则我的json()表示返回

InfoModel.query.filter_by(name="ShowName1").all()))

但是我也想返回相关的外表值,以便我的json()表示形式返回-

{
    "name": "InfoName1",
    "id": 1,
    "episode_id": 1
}

对于在这里使用行话感到困惑,我深表歉意,这使我的问题显得比实际更复杂。

1 个答案:

答案 0 :(得分:1)

由于启用了延迟加载,因此仅在访问联接表时才设置它们。您可以执行的是强制加入。像下面这样的东西应该适合您:

shows = session.query(ShowModel)
               .join(EpisodeModel)
               .join(InfoModel)
               .filter(ShowModel.name == "foo")
               .all()

您还可以将负载配置更改为“ eager”,或任意数量的其他选项。我不喜欢默认情况下执行此操作,因为它会导致意外的昂贵查询:https://docs.sqlalchemy.org/en/latest/orm/loading_relationships.html