在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
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。

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)

部署时的网络优化建议
- 数据库连接使用内网地址,避免走公网流量
- 静态文件交给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项目来说绰绰有余。










网友评论