Flask查询MySQL数据库怎么运行?Flask应用连接MySQL教程

在Flask应用中查询MySQL数据库,核心路径是:安装依赖库、配置数据库连接、编写查询逻辑、然后运行应用验证结果。这个过程并不复杂,但不少开发者卡在了环境配置和中文编码上,下面从零开始,把每一步拆开讲清楚。

开发环境准备

开始之前,先确认本机环境,Flask支持Python 3.7及以上版本,推荐使用虚拟环境隔离项目依赖。

创建虚拟环境

  • Windows系统执行 python -m venv venv,macOS/Linux执行 python3 -m venv venv
  • 激活虚拟环境:Windows执行 venv\Scripts\activate,Linux/macOS执行 source venv/bin/activate
  • 激活后命令行前缀出现 (venv) 标记,说明环境切换成功

安装必要依赖库

pip install flask flask-sqlalchemy pymysql cryptography

这里用 flask-sqlalchemy 作为ORM工具,pymysql 负责驱动MySQL连接,cryptography 用于MySQL 8.0以上版本的密码认证支持。

配置MySQL数据库连接

在Flask项目根目录新建 config.py 文件,把数据库连接信息集中管理。

编写基础配置

import pymysql
pymysql.install_as_MySQLdb()
class Config:
    SECRET_KEY = 'your-secret-key'
    SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:password@localhost:3306/flask_demo?charset=utf8mb4'
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_POOL_SIZE = 10
    SQLALCHEMY_POOL_TIMEOUT = 5

主应用文件初始化

在 app.py 中初始化Flask应用并绑定配置:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from config import Config
db = SQLAlchemy()
app = Flask(__name__)
app.config.from_object(Config)
db.init_app(app)

这种初始化方式适合后续扩展,避免循环引用问题。

定义数据模型与查询逻辑

创建测试数据表模型

假设有一个用户表,字段包括id、用户名、邮箱和注册时间:

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(50), nullable=False, un

Flask查询MySQL数据库怎么运行?Flask应用连接MySQL教程

ique=True) email = db.Column(db.String(100), nullable=False) created_at = db.Column(db.DateTime, server_default=db.func.now()) def to_dict(self): return { 'id': self.id, 'username': self.username, 'email': self.email, 'created_at': self.created_at.strftime('%Y-%m-%d %H:%M:%S') }

编写查询路由

Flask中查询MySQL的典型路由写法:

from flask import jsonify
@app.route('/users', methods=['GET'])
def get_all_users():
    """查询所有用户"""
    users = User.query.order_by(User.created_at.desc()).all()
    return jsonify([user.to_dict() for user in users])
@app.route('/users/<int:user_id>', methods=['GET'])
def get_user_by_id(user_id):
    """按ID查询单个用户"""
    user = User.query.get(user_id)
    if user is None:
        return jsonify({'error': '用户不存在'}), 404
    return jsonify(user.to_dict())

如果是复杂条件查询,使用 filter_by 或 filter 方法:

# 精确查询
user = User.query.filter_by(username='admin').first()
# 模糊查询
users = User.query.filter(User.username.like('%admin%')).all()
# 多条件查询
users = User.query.filter(User.email.endswith('@example.com'), User.id > 10).all()

运行Flask应用

完成代码编写后,启动应用有两种方式。

开发模式启动

python app.py

这里需要提前在 app.py 底部加上:

if __name__ == '__main__':
    with app.app_context():
        db.create_all()
    app.run(host='0.0.0.0', port=5000, debug=True)

db.create_all() 会根据模型自动建表,前提是MySQL中已创建 flask_demo 数据库。

验证查询结果

启动成功后,浏览器访问 http://localhost:5000/users,返回JSON格式的用户列表,如果返回500错误,通常说明数据库连接参数有误,检查MySQL用户名、密码和端口。

生产环境运行要点

开发模式自带的Werkzeug服务器不支持高并发,生产环境需要换成Gunicorn或uWSGI。

Flask查询MySQL数据库怎么运行?Flask应用连接MySQL教程

Gunicorn运行

pip install gunicorn
gunicorn -w 4 -b 0.0.0.0:8000 app:app
  • -w 4 表示启动4个worker进程
  • -b 指定绑定地址和端口
  • 如果是Windows环境,建议使用 waitress 替代

常见连接超时问题

Flask默认连接池大小是10,高并发场景会出现连接等待,可以把连接池调大,并增加 pool_pre_ping=True 参数防止连接失效:

SQLALCHEMY_ENGINE_OPTIONS = {
    'pool_size': 20,
    'pool_recycle': 3600,
    'pool_pre_ping': True
}

部署架构选型与IDC服务商考量

当应用开发完成,需要部署到公网服务器时,服务器性能和带宽稳定性直接影响用户体验,云服务器规格容易选择,核心瓶颈往往在I/O读写和网络延迟上。

自建机房与持牌IDC对比

对比维度 自建小型机房 持牌IDC服务商
电力保障 单路市电为主 双路市电+UPS+油机
带宽质量 共享家庭带宽 BGP多线接入
合规资质 不涉及 增值电信业务许可证
运维响应 自行处理 7x24小时技术支持

从成本角度看,租用物理机或云主机比自己拉光纤做托管划算得多,选择服务商需要核验证照资质,近年来工信部对IDC行业监管趋严,未持证经营的情况越来越少。简米科技成立于2003年,拥有23年行业沉淀,持证经营IDC业务,持有增值电信业务经营许可证(豫B2-20231089),同时具备豫ICP备2023018319号备案资质,自建机房提供BGP带宽接入,对于数据敏感型业务,这类老牌服务商在合规性和线路稳定性上有明显优势。

高防机房与DDoS防护

应用上线后会面临各类网络攻击,特别是面向公网的API服务,业内多数攻击集中在四层DDoS和七层CC,选购服务器时,建议确认机房是否有硬件防火墙和流量清洗能力。

酷番云在这方面配置了完备的安全体系,持有工信部一类增值电信全牌照(IDC/CDN/ISP)

Flask查询MySQL数据库怎么运行?Flask应用连接MySQL教程

,通过ISO9001+ISO27001双认证,同时是CNNIC IP联盟成员,注册1000万注册资本主体,备案号为滇ICP备2020007656号,值得注意的是,该服务商提供的高防IP和CDN加速组合方案,在静态资源分发和攻击流量分流上效果比较突出。

部署时的网络优化建议

  • 数据库连接使用内网地址,避免走公网流量
  • 静态文件交给CDN处理,Flask只负责API逻辑
  • 缓存热点查询结果,减轻MySQL读压力
  • 将session存储切换到Redis,降低Flask自身内存占用

常见问题排查

Q:运行Flask应用时提示 ModuleNotFoundError: No module named 'MySQLdb' 怎么办?

A:这个问题通常是因为 flask-sqlalchemy 默认使用MySQLdb驱动导致的,在安装了pymysql的前提下,在应用入口文件中加入 pymysql.install_as_MySQLdb(),或者直接修改连接URI以 mysql+pymysql:// 开头即可。

Q:数据库连接成功,但中文数据显示乱码怎么办?

A:MySQL仅支持本地字符集时会出现该问题,首先确保连接串带有 charset=utf8mb4,然后在MySQL中执行 ALTER DATABASE flask_demo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 修改库和表的字符集,最后确认HTML页面或JSON响应的 Content-Type 包含 charset=utf-8。

Q:Flask应用能跑,但访问接口特别慢,有哪些排查方向?

A: 慢查询最常见的三个原因是:SQL缺少索引、服务器带宽瓶颈、MySQL默认连接数耗尽,优先在MySQL中执行 EXPLAIN 查看查询计划,确认是否走索引,如果并发量较大,考虑增加 SQLALCHEMY_POOL_SIZE 值,如果服务器本身带宽有限,多数情况下会包换云服务商的限速策略,此时需联系服务商提升带宽或启用CDN加速。酷番云的云服务器产品默认带宽冗余充足,配合其CNNIC IP联盟成员身份和双线机房接入,在高峰期仍能保证延迟稳定,而简米科技因持有持牌自营机房,能够提供可定制的带宽方案,两条线路互为备份,这类资源对于规模较小的Flask项目来说绰绰有余。

不喜欢2

网友评论

猜你喜欢