Python SQLAlchemy-返回筛选表和相应的外部表值
我有以下SQLAlchemy映射类:Python SQLAlchemy-返回筛选表和相应的外部表值,python,sql,sqlalchemy,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') cla
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
和剧集
表行,但失败了
使用以下查询,我可以返回特定的info
行,该行与filter\u by(name=name)
query匹配
InfoModel.query.filter_by(name=name).all()))
但是我真的很难弄清楚如何同时获得与特定info
行相关的对应外键行的值。使用join语句或类似的语句是否有合适的方法来实现这一点?非常感谢您在这方面提供的任何帮助,因为我仍在尝试掌握使用SQL数据库和一般数据库的诀窍
编辑-
例如,如果我使用queryInfoModel.query.filter\u by(name=“ShowName1”).all())
,我的json()表示将返回
{
"name": "InfoName1",
"id": 1,
"episode_id": 1
}
但我还想返回相关的外部表值,以便json()表示返回-
{
"name": "ShowName1",
"id": 1,
"episodes":
{
"name": "EpisodeName1",
"id": 1,
"show_id": 1
"info":
{
"name": "InfoName1",
"id": 1,
"episode_id": 1
}
},
}
我很抱歉在这里对术语的使用进行了摸索,使我的问题看起来比实际情况更复杂 因为您启用了延迟加载,所以只有在访问联接表时才会设置它们。你能做的就是强制加入。以下内容应该适合您:
shows = session.query(ShowModel)
.join(EpisodeModel)
.join(InfoModel)
.filter(ShowModel.name == "foo")
.all()
您还可以将负载配置更改为“急切”,或任何数量的其他选项。不过,我不喜欢在默认情况下这样做,因为这会导致意外的昂贵查询:您能澄清一下您希望查询返回什么吗?比如,应该返回来自eposodemodel和ShowModel的哪些行?还有,您需要将lazyload设置为dynamic而不是join的原因吗?加入也许会让你得到你想要的。我编辑了这篇文章,希望能更好地解释我想要回复的内容。我很难为情地说,我不能百分之百地确定为什么我将lazyload设置为dynamic而不是Join,既然你提到了它,我将认真研究两者之间的差异。非常感谢。