Flask SQLAlchemy查询联接

时间:2019-08-06 02:26:37

标签: python sql sqlalchemy flask-sqlalchemy

我有2张这样的桌子:

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 个答案:

答案 0 :(得分:1)

如果您的实体来自不同的类/表,则意味着存在联接,SQL Alchemy会将其添加到实际的SQL中。如果该连接不是SQL Alchemy使用的连接(可以从外键等检索),则可以添加自定义连接。

答案 1 :(得分:1)

区别在于,第一个查询会将Tagusers都添加到roles列表中,从而得到FROM。换句话说,CROSS JOIN中的每一行都与users中的每一行连接在一起。第二个查询执行roles,SQLAlchemy根据表之间的外键关系推导INNER JOIN子句。

如果要使用笛卡尔积,则应使用第一个,而要通过外键关系与用户相关的角色,则应使用第二个。结果碰巧对您来说只是一个巧合。

为将来参考,请尝试启用echo,以便您可以从日志中查看实际发出了哪些查询。还可以查看defining ORM relationships,这将使您可以在ON上拥有一个role属性,以访问与其相关的User