Flask连接MySQL数据库全攻略(避坑指南)
·
文章目录
为什么你的Flask项目需要MySQL?(新手必看)
MySQL这个老牌关系型数据库(真是稳如老狗!)和Flask的轻量级特性简直是天作之合。想象一下:你的用户数据、订单记录、产品信息都需要一个靠谱的"储物柜",而MySQL就是那个带密码锁的保险柜!(最新统计显示,超过63%的Python Web项目使用MySQL作为主力数据库)
但先别急着写代码!咱们得先搞明白几个关键问题:
- 是直接用原生SQL还是用ORM?(新手建议先用ORM,后面解释为什么)
- 连接池配置要注意什么?(小心并发量大的时候翻车!)
- 如何防止SQL注入攻击?(安全第一啊朋友们)
环境准备(别在这步翻车!)
必备软件清单
- Python 3.8+(别用3.7以下,会哭的)
- MySQL 8.0(官方下载记得选社区版)
- Flask 2.0.x(新版本更香)
- 推荐安装PyMySQL驱动(比mysqlclient安装简单)
安装姿势要正确
# 先激活你的虚拟环境!(重要的事情说三遍)
pip install flask pymysql
安装时常见坑点:如果报错"ERROR: Could not build wheels for PyMySQL",八成是没装Python开发依赖库。Ubuntu系统记得:
sudo apt-get install python3-dev
连接配置(核心机密在这里)
在config.py里这样写:
class Config:
MYSQL_HOST = 'localhost' # 别傻乎乎写127.0.0.1!
MYSQL_PORT = 3306 # 默认端口记得改!
MYSQL_USER = 'your_user' # 千万别用root账号!
MYSQL_PASSWORD = 'super_strong_pwd' # 密码要复杂
MYSQL_DB = 'flask_demo' # 数据库先手动创建好
MYSQL_CHARSET = 'utf8mb4' # 支持表情符号存储
重要安全提示:永远不要把配置直接写在代码里!推荐用.env文件+python-dotenv加载(保护你的数据库密码)
ORM实战(SQLAlchemy真香警告)
初始化姿势
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def create_app():
app = Flask(__name__)
app.config.from_object(Config)
db.init_app(app)
# 记得这个上下文管理器!
with app.app_context():
db.create_all()
return app
模型定义模板
class User(db.Model):
__tablename__ = 'users' # 表名别用单数!
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
def __repr__(self):
return f'<User {self.username}>'
注意坑点:表名默认是类名小写形式,但建议显式声明。字段长度别随便写,特别是字符串类型!
CRUD操作实录(手把手教学)
创建数据
new_user = User(username='码农阿杰', email='jie@dev.com')
db.session.add(new_user)
try:
db.session.commit() # 记得提交!
except IntegrityError:
db.session.rollback() # 邮箱重复时回滚
查询技巧
# 获取全部用户(小心数据量!)
users = User.query.all()
# 条件查询(注意SQL注入防护)
user = User.query.filter_by(username='码农阿杰').first()
# 复杂查询(演示join操作)
from sqlalchemy import and_
result = db.session.query(User).filter(
and_(
User.email.like('%@dev.com'),
User.username != 'admin'
)
).limit(10).all()
性能优化三板斧(高并发必备)
- 连接池配置(在config追加):
SQLALCHEMY_POOL_SIZE = 20 # 默认是5
SQLALCHEMY_POOL_RECYCLE = 3600 # 1小时回收连接
- 索引优化:在经常查询的字段(如username、email)加索引
class User(db.Model):
# 在字段定义后加
__table_args__ = (
db.Index('idx_username', 'username'),
db.Index('idx_email', 'email'),
)
- 启用查询缓存(适合读多写少场景):
from flask_caching import Cache
cache = Cache(config={'CACHE_TYPE': 'SimpleCache'})
常见报错大全(血泪经验总结)
错误1:2003 Can’t connect to MySQL server
✅ 检查项:
- MySQL服务是否启动(sudo systemctl status mysql)
- 防火墙是否开放3306端口
- 用户是否有远程连接权限(GRANT语句要正确)
错误2:1366 Incorrect string value
👉 解决方案:
- 检查数据库、表、字段的字符集是否为utf8mb4
- 修改MySQL配置文件:
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
错误3:Commands out of sync
💡 这个一般是多次执行execute没关闭cursor导致的,推荐使用上下文管理器:
with db.engine.connect() as connection:
result = connection.execute(text("SELECT ..."))
进阶路线图(从入门到精通)
- 掌握数据库迁移工具(Flask-Migrate)
- 学习读写分离配置(主从复制)
- 研究分库分表方案(sharding)
- 了解ORM高级特性(hybrid_property、事件监听)
- 尝试异步驱动(aiomysql+async Flask)
最后送大家一句话:数据库连接是Web应用的命脉,既要保证安全,又要追求性能。多测试、多监控(推荐用Flask-SQLAlchemy的请求分析器),你的应用才会健步如飞!
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)