二级联接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的主要内容,如果未能解决你的问题,请参考以下文章