[Flask]sqlalchemy使用count()函数,实现快速查询

本文探讨了在Python Flask应用中,使用Flask-SQLAlchemy对大规模数据库表进行高效计数查询的方法。通过对比原代码和优化后的代码,展示了如何避免使用子查询以提高查询速度和减少内存消耗。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@创建于:2020.03.28
@修改于:2020.03.28

1. 背景

在python flask中,用sql语句进行 查询,如何做到前端请求数据后快速返回?

如:在使用flask-sqlalchemy对一个千万级别表进行count操作时,出现了耗时严重、内存飙升的问题。

2. 解决办法对比
2.1 原代码

说明:进行了一次子查询,会生成临时表,效率低。

# 统计当日登陆次数
count = LoginLog.query.filter(LoginLog.username == username, LoginLog.status == 0, db.cast(LoginLog.time, db.DATE) == db.cast(datetime.utcnow(), db.DATE)).count()

# sql打印
SELECT
    count(*) AS count_1
FROM
    (
        SELECT
            loginlog.id AS loginlog_id,
            loginlog.username AS loginlog_username,
            loginlog.time AS loginlog_time,
            loginlog. STATUS AS loginlog_status
        FROM
            loginlog
        WHERE
            loginlog.username = % (username_1) s
        AND loginlog. STATUS = % (status_1) s
        AND CAST(loginlog.time AS DATE) = CAST(%(param_1) s AS DATE)
    ) AS anon_1
2.2 优化后

说明:无子查询,效率高。

count = db.session.query(func.count(LoginLog.id)).filter(LoginLog.username == username, LoginLog.status == 0, db.cast(LoginLog.time, db.DATE) == db.cast(datetime.utcnow(), db.DATE)).scalar()


# sql打印
SELECT
    count(loginlog.id) AS count_1
FROM
    loginlog
WHERE
    loginlog.username = % (username_1) s
AND loginlog. STATUS = % (status_1) s
AND CAST(loginlog.time AS DATE) = CAST(%(param_1) s AS DATE)
3. 参考连接

[Flask]sqlalchemy使用count()函数遇到的问题

Flask Web 框架中实现关注功能,通常涉及以下几个步骤: 1. 用户模型设计:首先需要创建用户模型(User Model),包含用户的ID以及他们关注的其他用户列表(通常是通过外键关联)。可以使用 SQLAlchemy 这样的 ORM 工具来简化数据库操作。 ```python from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) followers = db.relationship('Follower', backref='follower_user', lazy=True) ``` 2. 关注表的设计:创建一个单独的表 Follower 来存储关注关系,通常包括两个字段,一个是主用户的 ID(followed_id),另一个是从属用户的 ID(follower_id)。 ```python class Follower(db.Model): id = db.Column(db.Integer, primary_key=True) followed_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) follower_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) ``` 3. 添加关注和取消关注方法:在 User 类中添加对关注状态的操作方法,如 `follow`, `unfollow` 等。 ```python class User(UserMixin, db.Model): # ... def follow(self, user): if not self.is_following(user): self.followers.append(Follower(followed=user)) def unfollow(self, user): if self.is_following(user): self.followers.remove(user) def is_following(self, user): return self.followers.filter_by(follower=user).count() > 0 ``` 4. URL 规划和视图函数:设置路由来处理关注请求,比如 `/users/{user_id}/follow` 和 `/users/{user_id}/unfollow`,并编写相应的视图函数来调用上述方法。 5. 表单验证和前端交互:在前端界面展示用户的关注列表,并提供按钮供用户点击以关注或取消关注。使用 Flask-WTF 或类似库来处理表单验证和 HTTP 请求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值