我有三个表格角色,页面和角色页面。我尝试在关联表中使用带有额外数据的关联类,如下面的链接https://docs.sqlalchemy.org/en/13/orm/basic_relationships.html。这是我的模型课
class RolePage(db.Model):
__tablename__ = 'role_pages'
role_id = db.Column(db.Integer, db.ForeignKey('roles.role_id'), primary_key=True)
page_id = db.Column(db.Integer, db.ForeignKey('pages.page_id'), primary_key=True)
can_readed = db.Column(db.Boolean, default=False)
can_created = db.Column(db.Boolean, default=False)
can_updated = db.Column(db.Boolean, default=False)
can_deleted = db.Column(db.Boolean, default=False)
can_submited = db.Column(db.Boolean, default=False)
can_approved = db.Column(db.Boolean, default=False)
arole = db.relationship('Role', back_populates='pages')
apage = db.relationship('Page', back_populates='roles')
def __repr__(self):
return f'<RolePage ({self.role_id}, {self.page_id}, {self.can_readed}, {self.can_created})>'
class Role(db.Model):
__tablename__ = 'roles'
role_id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(32), unique=True, nullable=True)
pages = db.relationship('RolePage', back_populates='arole')
def __repr__(self):
return f'<Role {self.name}>'
class Page(db.Model):
__tablename__ = 'pages'
page_id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(32), unique=True, nullable=True)
roles = db.relationship('RolePage', back_populates='apage')
def __repr__(self):
return f'<Page {self.name}>'
我的问题是,我想使用左连接进行查询,就像我在sql中进行的查询一样:
select * from pages p
left join role_pages rp on rp.page_id = p.page_id and rp.role_id = 2
left join roles r on r.role_id = rp.role_id;
我尝试使用ORM查询left join
表
Page.query\
.outerjoin(RolePage, and_(RolePage.role_id==id))\
.all()
但是left join
不起作用。使用left join
的最佳方式是什么?就像我在sqlalchemy中遇到的问题一样
谢谢
在阅读了SQLAlchemy和许多论坛的文档之后。我得到了答案。要查询use
left join
,我们可以使用isouter=True
或.outerjoin()
。 在我的例子中,我使用flask sqlalchemy来选择列,我使用.with_entities()
,因为我有一个同名的列,我使用.label()
来创建别名。这是我的SQLALchemy代码:这就解决了我的问题
要使用ORM,请创建一个会话 请参阅该文件
https://docs.sqlalchemy.org/en/13/orm/tutorial.html
相关问题 更多 >
编程相关推荐