Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy-返回筛选表和相应的外部表值_Python_Sql_Sqlalchemy - Fatal编程技术网

Python 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

我有以下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
剧集
表行,但失败了

使用以下查询,我可以返回特定的
info
行,该行与
filter\u by(name=name)
query匹配

InfoModel.query.filter_by(name=name).all()))
但是我真的很难弄清楚如何同时获得与特定
info
行相关的对应外键行的值。使用join语句或类似的语句是否有合适的方法来实现这一点?非常感谢您在这方面提供的任何帮助,因为我仍在尝试掌握使用SQL数据库和一般数据库的诀窍

编辑-

例如,如果我使用query
InfoModel.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,既然你提到了它,我将认真研究两者之间的差异。非常感谢。