Flask SQLAlchemy查询连接

3

我有两个像这样的表:

class Role(db.Model):
    __tablename__ = 'roles'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)
    index = db.Column(db.String(64))
    users = db.relationship('User',
                            backref='role', lazy='dynamic')

class User(UserMixin, db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(64), unique=True, index=True)
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))

我将尝试制作两种查询,以获取关系模型的数据。

首先,我将按照如下方式进行:

user = db.session.query(User, Role.index).filter_by(email=form.email.data).first()

我使用第二个语句在其中使用join

user = db.session.query(User, Role.index).join(Role).filter(User.email==form.email.data).first()

我的问题是,在第二个查询中我使用了join语句,但结果仍然相同,在这种查询中有什么区别?
对于快速查询或性能,我应该使用第一个还是第二个?
2个回答

1
如果您的实体来自不同的类/表,则加入是隐含的,并且SQL Alchemy将其添加到实际的SQL中。如果该连接不是SQL Alchemy使用的连接(从外键或类似方式检索),则可以添加自定义连接。

1
区别在于第一个查询将usersroles都添加到FROM列表中,这导致了一个CROSS JOIN。换句话说,来自users的每一行都会与来自roles的每一行连接。第二个查询执行了一个INNER JOIN,并且SQLAlchemy根据表之间的外键关系推断出了ON子句。
当您想要笛卡尔积时,应使用第一个查询,而当您想要通过外键关系与用户相关联的角色时,应使用第二个查询。您得到的结果恰好相同只是巧合。
以后可以尝试启用echo,这样您可以从日志中检查实际发出的查询。还可以查看defining ORM relationships,这将允许您在User上拥有一个role属性,以访问其相关的Role

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接