二级联接Sqlalchemy

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二级联接Sqlalchemy相关的知识,希望对你有一定的参考价值。

我有三个Model类,代表我的PostgreSQL数据库中的三个表:Project,Label,ProjectLabel。许多项目可以具有多个标签:

class Project(db.Model):
    __tablename__ = 'projects'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String())
    labels = db.relationship('ProjectLabel')

class Label(db.Model):
    __tablename__ = 'labels'

    label_id = db.Column(db.Integer, primary_key=True)
    label_name = db.Column(db.String())

class ProjectLabel(db.Model):
    __tablename__ = 'projects_labels'

    projectlabel_id = db.Column(db.Integer, primary_key=True)
    projectlabel_projectid = db.Column(db.Integer, db.ForeignKey('projects.id'))
    projectlabel_labelid = db.Column(db.Integer, db.ForeignKey('labels.label_id'))

如何查询项目模型,以便可以从labels表中获取对象?

具体地说,如何获得分配给项目的标签的label_name?我以某种方式需要在Project(labels)-> ProjectLabel-> Label classes

之间进行连接
答案

这将获得长格式的相关标签:

db.session.query(Project.id,
                 Label.label_name)\
          .filter(ProjectLabel.projectlabel_projectid==Project.id)\
          .filter(Label.label_id==ProjectLabel.projectlabel_labelid)\
          .order_by(Project.id.asc()).all()

如果要用逗号分隔列表中的标签,请使用func.group_concat()

db.session.query(Project.id,
                 func.group_concat(Label.label_name).label('related_labels'))\
          .filter(ProjectLabel.projectlabel_projectid==Project.id)\
          .filter(Label.label_id==ProjectLabel.projectlabel_labelid)\
          .group_by(Project.id)\
          .order_by(Project.id.asc()).all()

以上是关于二级联接Sqlalchemy的主要内容,如果未能解决你的问题,请参考以下文章

公路等级

公路等级

SQL联接 外联接 内联接 完全联接 交叉联接

联接 (SQL Server)

详解T-SQL的联接机制

内部联接和简单联接之间是不是有任何性能差异? [复制]