Flask连接MySQL全攻略:手把手教你玩转数据库交互(实战向)
(重点来了!现在你已经掌握了Flask+MySQL的核心玩法!开发环境与生产环境配置要分离(可用.env文件)数据库迁移不要直接在生产环境操作定期查看MySQL的慢查询日志永远对用户输入进行验证!# 错误示范 query = f"SELECT * FROM users WHERE name = ' {name } '" # 正确做法 User . query . filter(User . nam
·
一、为什么你的Flask项目需要MySQL?(新手必看)
还在用SQLite搞开发?当项目要上线时绝对让你哭晕在厕所!(别问我怎么知道的)MySQL作为企业级数据库扛把子,拥有以下绝对优势:
- 高并发处理能力(支持千人同时在线)
- 数据安全保障(自动备份不香吗?)
- 可视化工具丰富(Navicat用过的都说好)
- 分布式部署支持(未来扩展无忧)
二、环境准备四步走(超级重要!!)
1. 安装mysqlclient驱动(坑最多的一步)
pip install mysqlclient
如果报错mysql_config not found
,先执行:
sudo apt-get install libmysqlclient-dev # Ubuntu/Debian
brew install mysql-client # MacOS
2. 创建MySQL数据库(不要跳过!)
打开MySQL命令行:
CREATE DATABASE flask_demo CHARACTER SET utf8mb4;
(敲黑板!)字符集必须用utf8mb4才能支持emoji表情存储
3. 配置Flask-SQLAlchemy扩展
from flask_sqlalchemy import SQLAlchemy
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://用户名:密码@localhost:3306/flask_demo'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # 关闭警告
db = SQLAlchemy(app)
三、模型定义实战(ORM真香警告)
用户模型示例
class User(db.Model):
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)
def __repr__(self):
return '<User %r>' % self.username
(重点来了!)执行数据库迁移:
flask db init
flask db migrate
flask db upgrade
四、CRUD操作速成手册
1. 创建数据
new_user = User(username='码农小明', email='coder@example.com')
db.session.add(new_user)
db.session.commit() # 忘记commit是新手常犯错误!
2. 查询数据
# 获取所有用户
users = User.query.all()
# 条件查询(注意filter的链式调用)
admin = User.query.filter_by(username='admin').first()
3. 更新数据
user = User.query.get(1)
user.email = 'new_email@example.com'
db.session.commit()
4. 删除数据
db.session.delete(user)
db.session.commit()
五、高级技巧避坑指南
1. 连接池配置(性能飙升秘籍)
app.config['SQLALCHEMY_POOL_SIZE'] = 20
app.config['SQLALCHEMY_POOL_RECYCLE'] = 300 # 5分钟回收连接
2. 事务处理(资金操作必看)
try:
# 转账操作示例
user1.balance -= 100
user2.balance += 100
db.session.commit()
except:
db.session.rollback()
raise
3. 查询优化技巧
# 避免N+1查询问题
users = User.query.options(db.joinedload('posts')).all()
六、常见报错解决方案
错误1:1045 Access denied
检查:
- MySQL用户权限是否正确
- 密码是否包含特殊字符(建议用字母+数字)
- 是否开启远程访问(开发环境可临时关闭防火墙)
错误2:2006 MySQL server has gone away
解决方法:
- 增加连接池配置
- 检查MySQL的wait_timeout设置
- 添加心跳检测机制
七、安全加固必做清单(重要!)
- 永远不要硬编码密码!使用环境变量:
app.config['SQLALCHEMY_DATABASE_URI'] = f"mysql://{os.getenv('DB_USER')}:{os.getenv('DB_PWD')}@localhost/flask_demo"
- 开启SSL连接(云数据库必须):
app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {
'connect_args': {
'ssl': {'ca': '/path/to/server-ca.pem'}
}
}
- 定期备份策略:
mysqldump -u root -p flask_demo > backup_$(date +%F).sql
八、性能监控方案
推荐使用Flask-SQLAlchemy自带的监听器:
from sqlalchemy import event
from sqlalchemy.engine import Engine
@event.listens_for(Engine, "before_cursor_execute")
def before_cursor_execute(conn, cursor, statement, parameters, context, executemany):
context._query_start_time = time.time()
@event.listens_for(Engine, "after_cursor_execute")
def after_cursor_execute(conn, cursor, statement, parameters, context, executemany):
total = time.time() - context._query_start_time
if total > 0.5: # 记录慢查询
app.logger.warning(f"Slow query: {statement} took {total:.2f}s")
实战总结
现在你已经掌握了Flask+MySQL的核心玩法!但要注意:
- 开发环境与生产环境配置要分离(可用.env文件)
- 数据库迁移不要直接在生产环境操作
- 定期查看MySQL的慢查询日志
最后送上黄金法则:永远对用户输入进行验证! 防止SQL注入的最基本方法:
# 错误示范
query = f"SELECT * FROM users WHERE name = '{name}'"
# 正确做法
User.query.filter(User.name == name)
赶紧打开PyCharm动手试试吧!遇到问题欢迎在评论区交流(但别问为什么Navicat连不上,先检查3306端口开没开)🚀

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)