Python 在sqlalchemy中连接表以在flask应用程序的查询中获得多个关系

Python 在sqlalchemy中连接表以在flask应用程序的查询中获得多个关系,python,sqlalchemy,flask-sqlalchemy,Python,Sqlalchemy,Flask Sqlalchemy,如何从groupby变量中查询所有manys--2个表 我的数据结构如下(即使我的数据库允许多对多无处不在) 我的数据就像蝴蝶结 语法 语法--集群--集群细节--集群细节--何时 语法 对于每个syntax.filename我需要所有Whenz.freq 我的型号 clump_syntaxs = db.Table('clump_syntaxs', db.Column('syntax_id', db.Integer, db.ForeignKey('syntax.id')), d

如何从groupby变量中查询所有manys--2个表

我的数据结构如下(即使我的数据库允许多对多无处不在)

我的数据就像蝴蝶结

语法 语法--集群--集群细节--集群细节--何时
语法

对于每个syntax.filename我需要所有Whenz.freq

我的型号

clump_syntaxs = db.Table('clump_syntaxs',
    db.Column('syntax_id', db.Integer, db.ForeignKey('syntax.id')),
    db.Column('clump_id', db.Integer, db.ForeignKey('clump.id')),
)

clump_deets = db.Table('clump_deets',
    db.Column('clumpdetail_id', db.Integer, db.ForeignKey('clumpdetail.id')),
    db.Column('clump_id', db.Integer, db.ForeignKey('clump.id')),
)
when_deets = db.Table('when_deets',
    db.Column('clumpdetail_id', db.Integer, db.ForeignKey('clumpdetail.id')),
    db.Column('whenz_id', db.Integer, db.ForeignKey('whenz.id')),
)
class Whenz(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(150))
    freq = db.Column(db.String(150))
    frequency = db.relationship('Clumpdetail', secondary=when_deets,
        backref=db.backref('frequency', lazy='dynamic'))
    def __repr__(self):
        return  str(self.title)

class Clumpdetail(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    whenhour = db.Column(db.Time())
    wherevar = db.Column(db.String(150))
    cat = db.Column(db.String(150))
    clumps = db.relationship('Clump', secondary=clump_deets,
        backref=db.backref('deets', lazy='dynamic'))
    def __repr__(self):
        return str(self.cat)

class Clump(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    clumpname = db.Column(db.String(150), unique=True)
    ordervar = db.Column(db.Integer)
    syntaxs = db.relationship('Syntax', secondary=clump_syntaxs,
        backref=db.backref('clumps', lazy='dynamic'),order_by="Syntax.position",
                            collection_class=ordering_list('position'))
    def __repr__(self):
        return   str(self.clumpname)

class Syntax(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    filename = db.Column(db.String(150), unique=True,)
    jobs = db.relationship('Jobs',lazy='dynamic', backref='jobhistory')
    position = db.Column(db.Integer)
    def __repr__(self):
        return str(self.filename)
 .... cut.
我的许多尝试

joblist=db.session.query((models.Syntax.filename).label('filename'),\
    (models.Clump.clumpname).label('clumpname'),\
    (models.Clumpdetail.whenhour).label('hour'),\
    (models.Clumpdetail.wherevar).label('where'),\
    (models.Clumpdetail.cat).label('cat'),\
    (models.Whenz.freq).label('freq'))\
.outerjoin((models.Syntax.clumps,models.Clump))\
.outerjoin((models.Clump.deets,models.Clumpdetail))\
.outerjoin((models.Clumpdetail.frequency,models.Whenz))\
.group_by(models.Syntax.filename).all()
我期待这一行

    (models.Whenz.freq).label('freq'))\
给我所有的时间,但它只给我一个。为什么呢

我能用它得到我想要的东西

models.Syntax.query.filter_by(filename=models.Syntax.query.first()\
.filename).first()\
.clumps.first()\
.deets.first()\
.frequency.all()
但这只是一个接一个的,我希望它是syntax.filename


谢谢

这是因为的小组。如果按
syntax.filename
进行分组,则每个唯一的文件名只有一行,因此不会返回所有的
freq

如果您想要一个SQLAlchemy核心解决方案,请删除
groupby
并自己用python对结果进行分组

如果需要SQLAlchemy ORM解决方案,可以使用subqueryload:

Syntax.query.options(subqueryload(Syntax.clumps).subqueryload(Clump.deets).subqueryload(Clumpdetail.frequency)).all()

注意:我相信您必须删除
Syntax.clumps
Clump.deets
Clumpdetail.frequency
上的
lazy=“dynamic”
,谢谢!如何将子查询连接到我的查询?如果是Syntax.query.options(subqueryload(Syntax.clumps)。subqueryload(Clump.deets)。subqueryload(Clumpdetail.frequency)).all()*请注意在…ency中的额外“)”)。all()如果我在python中进行分组,我只对pandas进行过分组,但这可能会降低我的应用程序使用pandas的速度?你知道一个groupby方法对我有用吗?我可以搜索示例?说真的,谢谢你!花了一整天的时间想弄明白out@ChetMeinzer试试看。经验法则是你不应该做过早的优化。如果你实现了它,并且发现这个部分很慢,那么你可以对它进行优化;然而,最有可能的是你的应用程序的其他部分将成为瓶颈。