Flask连接MySQL数据库,首推Flask-SQLAlchemy配合PyMySQL,这是生产环境最主流的方案,既保留了ORM的便利性,又避免了原生SQL的繁琐。
新手通常会被各种配置吓到,其实拆开来看就几步:装库、写URI、初始化、跑模型,下面我按实际开发顺序,把关键节点和常见坑都捋一遍。
Flask连接MySQL数据库配置步骤
本身就是很多人在百度搜的长尾词,flask连接mysql数据库配置到底要配哪些东西?我直接说结论。
安装依赖包
先装基础组件,建议用pip一次搞定:
- Flask-SQLAlchemy(ORM核心)
- PyMySQL(Python连接MySQL的驱动,兼容MySQLdb)
- cryptography(如果MySQL8+用了caching_sha2_password加密)
命令行执行:
pip install flask-sqlalchemy pymysql cryptography
有些老教程推荐mysql-connector-python,但PyMySQL在社区中更活跃,据官方文档统计,PyMySQL的下载量长期领先,遇到问题更容易找到解决方案。
配置数据库URI
URI是连接字符串,写法固定:
mysql+pymysql://用户名:密码@主机:端口/数据库名?charset=utf8mb4
举个例子,假设数据库在本地,用户root,密码123456,数据库名test:
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@localhost:3306/test?charset=utf8mb4'
注意密码中如果有特殊字符如@、#,需要URL编码,换成%40,行业共识认为,字符集推荐utf8mb4,能兼容emoji和生僻字,避免后期出乱码。
初始化数据库实例
在Flask应用主文件中,先创建app对象,再绑定配置,最后用SQLAlchemy初始化:
from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@localhost:3306/test?charset=utf8mb4' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # 关闭事件跟踪,减少内存开销 db = SQLAlchemy(app)
到此,Flask和MySQL的连接就搭好了,很多教程只写到这里,但实际开发中还有两步:创建模型和迁移表结构。
Flask连接MySQL数据库代码示例
对应百度另一个高频长尾词flask连接mysql数据库代码,我直接贴一段可运行的示例,你照着改就能跑起来。
定义模型
模型就是数据库的表,用类来定义:
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(80), nullable=False, unique=True)
email = db.Column(db.String(120), nullable=False, unique=True)
created_at = db.Column(db.DateTime, default=db.func.now())
def __repr__(self):
return f'<User {self.username}>'
字段类型和约束跟MySQL原生对应,String映射为varchar,Integer映射为int,DateTime映射为datetime。
增删改查操作
在视图函数中操作数据库,需要先创建上下文,因为Flask-SQLAlchemy依赖应用上下文。
创建表(首次运行):
with app.app_context():
db.create_all()
新增数据:
@app.route('/add')
def add_user():
new_user = User(username='张三', email='zhangsan@example.com')
db.session.add(new_user)
db.session.commit()
return '用户已添加'
查询数据:
@app.route('/user/<int:user_id>')
def get_user(user_id):
user = User.query.get(user_id)
if user:
return f'用户名: {user.username}, 邮箱: {user.email}'
return '未找到'
更新数据:
user = User.query.get(1) user.email = 'newemail@example.com' db.session.commit()
删除数据:
user = User.query.get(1) db.session.delete(user) db.session.commit()
注意每次修改后都要commit,否则操作不会持久化,业内专家指出,忘记commit是新手最常见的错误,占Flask数据库相关Bug的较大比例。
Flask连接MySQL数据库常见报错与解决
你搜这个长尾词,多半是遇到了问题,我整理了几个出现频率最高的,按场景分类。
Access denied for user ‘root’@’localhost’
一般原因是密码错误或用户权限不足,检查两点:
- URI中的密码是否写对,尤其注意特殊字符的URL编码
- 如果MySQL8+,默认认证插件是caching_sha2_password,PyMySQL需要cryptography支持,或者执行SQL修改用户插件:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码'; FLUSH PRIVILEGES;
Can’t connect to MySQL server on ‘localhost’ (10061)
MySQL服务没启动,或者端口不对,在Windows上检查服务管理器,Linux用systemctl status mysql,如果是服务器部署,还要确认防火墙开放了3306端口。
ModuleNotFoundError: No module named ‘MySQLdb’
这是因为URI中用了mysql://前缀,Flask-SQLAlchemy默认查找MySQLdb,而MySQLdb在Python3中不兼容,解决方案:把URI前缀改成mysql+pymysql://,并且在代码中导入PyMySQL并打补丁:
import pymysql pymysql.install_as_MySQLdb()
这个补丁能让Flask-SQLAlchemy以为自己用的是MySQLdb,实际由PyMySQL驱动。
Flask连接MySQL数据库性能优化建议
连接建立后,性能是长期维护的重点,很多教程只教怎么连,不教怎么用好。
连接池设置
Flask-SQLAlchemy默认使用SQLAlchemy自带的连接池,默认池大小5,超时10秒,对于高并发场景,这个值可能不够,可以在配置中调整:
app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {
'pool_size': 10,
'pool_recycle': 3600,
'pool_pre_ping': True,
}
pool_size:连接池大小,根据并发量设置,一般10-20。pool_recycle:连接回收时间,MySQL默认wait_timeout是8小时,建议池回收时间小于这个值,比如3600秒。pool_pre_ping:每次借用连接前发送ping,检测连接是否存活,避免获取到已断开的连接。
查询优化
ORM虽好,但嵌套查询时容易产生N+1问题,比如查询所有用户以及他们的文章,用User.query.all()然后遍历取user.articles,会触发多次查询,解决方案是使用joinedload或subqueryload:
from sqlalchemy.orm import joinedload users = User.query.options(joinedload(User.articles)).all()
这样只执行一条JOIN语句,数据量较大时效果明显。
Flask连接MySQL数据库在简米云上的部署要点
如果你在简米云ECS上部署,或者购买RDS,有几点需要特别注意,这也是地域词的长尾场景。
配置白名单
简米云RDS默认只允许内网连接,外网需要开启外网地址,并在安全组中添加白名单,内网连接时,Flask应用的URI中主机应填RDS的内网地址,速度更快且免流量费。
SSL连接
部分要求严格的环境需要开启SSL加密,简米云RDS提供了SSL证书,下载后将证书路径配置到URI中:
app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {
'connect_args': {
'ssl': {'ca': '/path/to/ca.pem', 'check_hostname': False}
}
}
注意,开启SSL会略微增加连接延迟,非敏感数据可以不配。
超时与重连
RDS的wait_timeout通常较短,如果应用长时间没有数据库操作,连接可能被关闭,加上pool_recycle和pool_pre_ping可以自动重连,避免出现”MySQL server has gone away”错误。
Flask连接MySQL数据库的常见问题解答
问:Flask连接MySQL数据库时,密码包含特殊字符怎么办?
答:对特殊字符进行URL编码,例如密码是my@pass,应写成my%40pass,也可以使用Python的urllib.parse.quote自动编码,避免手动替换出错。
问:flask连接mysql数据库代码中,每次启动都要手动创建表吗?
答:不需要,用db.create_all()或迁移工具Flask-Migrate,首次部署后,后续可通过flask db upgrade管理表结构变更,不丢失已有数据。
问:使用Flask-SQLAlchemy和直接使用PyMySQL,哪个更适合生产环境?
答:绝大多数场景选Flask-SQLAlchemy,它提供了ORM、会话管理、迁移工具,开发效率更高,只有极低延迟要求的场景才考虑原生SQL,但连接池、防注入等仍需要自己实现。
Flask连接MySQL数据库的核心思路就这些:扩展选型、URI配置、模型定义、CRUD操作,再加上连接池和常见错误处理。 按这个流程走下来,无论是本地开发还是云上部署,都能把数据库连接这件事稳下来。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/559133.html

