我有以下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
}
对于在这里使用行话感到困惑,我深表歉意,这使我的问题显得比实际更复杂。
答案 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