【问题标题】:Flask SQLAlchemy query joinFlask SQLAlchemy 查询连接
【发布时间】:2019-12-13 12:58:37
【问题描述】:

我有两个这样的表:

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'))

然后我尝试进行 2 种查询来获取关系模型的数据。

首先,我是这样写的:

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 语句但结果仍然相同。

为了快速查询或性能,我应该使用第一个还是第二个..?

【问题讨论】:

    标签: python sql sqlalchemy flask-sqlalchemy


    【解决方案1】:

    不同之处在于,第一个查询会将usersroles 添加到FROM 列表中,从而生成CROSS JOIN。换句话说,来自users 的每一行都与来自roles 的每一行相连接。第二个查询执行INNER JOIN,SQLAlchemy 根据表之间的外键关系推导出ON 子句。

    当你想要一个笛卡尔积时,你应该使用第一个,当你想要通过外键关系与用户相关的角色时,你应该使用第二个。结果恰好对你来说是一样的只是巧合。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2015-03-10
        • 2016-05-08
        • 1970-01-01
        • 2017-06-08
        • 1970-01-01
        • 2017-05-29
        • 2013-07-24
        • 1970-01-01
        • 2020-11-04
        相关资源
        最近更新 更多