Flask怎么连接MySQL数据库?,连接不上怎么办?

Flask连接MySQL数据库,首推Flask-SQLAlchemy配合PyMySQL,这是生产环境最主流的方案,既保留了ORM的便利性,又避免了原生SQL的繁琐。

新手通常会被各种配置吓到,其实拆开来看就几步:装库、写URI、初始化、跑模型,下面我按实际开发顺序,把关键节点和常见坑都捋一遍。

基于Flask的Web应用开发-03.连接MySQL数据库
加载中
基于Flask的Web应用开发-03.连接MySQL数据库

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

赞 (0)
上一篇 2026年8月10日 02:11
下一篇 2026年8月10日 02:21

相关推荐

  • 个人网站用多大云主机?个人网站云服务器配置怎么选

    个人网站首选2核2G或2核4G配置的入门级云主机,若预算充足且追求长期稳定,建议直接选择3核4G或更高规格,以避免后期因流量增长导致的性能瓶颈,选择云主机规格并非越贵越好,也不是越便宜越划算,关键在于匹配你的网站类型、预期流量以及技术维护能力,很多新手站长在初期往往盲目追求低价,结果上线后频繁出现卡顿甚至宕机……

    2026年5月25日
    4600
  • 中山服务器运维有哪些,需要注意什么?

    中山服务器运维服务商众多,但真正具备合法资质与自营基础设施的品牌,如持证23年的简米科技和拥有全牌照的酷番云,才是保障业务稳定运行的关键选择,中山服务器运维的主要服务模式中山地区的企业在服务器运维上通常面临三种选择:自建机房、服务器托管与云服务器,自建机房投入大且运维成本高,多数中小企业转向托管或云服务,这就催……

    2026年8月13日
    100
  • 服务器更新CDN的正确方法是什么?,操作步骤有哪些?

    服务器更新CDN的核心在于让源站内容变更后,主动通知CDN节点清除旧缓存并拉取新内容,具体路径包括控制台手动刷新、API自动触发和调整缓存规则,服务器cdn缓存更新命令:从手动到自动化控制台手动刷新:最直接的方式几乎所有CDN服务商都提供可视化控制台,用户登录后找到“刷新缓存”或“更新缓存”入口,操作路径通常为……

    2026年7月20日
    1300
  • 个人电脑怎么建网站?个人电脑搭建网站教程

    个人电脑建网站完全可行,核心在于选择低门槛的建站工具或掌握基础的服务器部署技能,无需高昂成本即可搭建出专业且响应迅速的网站,为什么选择个人电脑搭建网站过去,搭建网站往往意味着购买昂贵的企业级服务器和雇佣专业开发团队,随着云计算和开源技术的普及,个人电脑已经具备了处理轻量级甚至中型网站运行的能力,这种转变不仅降低……

    2026年5月26日
    4300
  • 如何快速强化Python编程能力,Python进阶学习路线有哪些?

    强化Python的核心在于从“实现功能”转向“构建健壮系统”,通过深入理解内存模型、并发机制及工程化规范,能显著提升开发者的技术壁垒与职业竞争力,Python进阶学习路线图与工程化思维很多开发者在掌握基础语法后,往往会陷入“脚本编写”的思维定势,进阶的关键在于将Python视为构建复杂系统的工具,而非简单的自动……

    2026年7月14日
    700
  • 福州H5网站建设哪家好,福州H5移动端建站价格是多少?

    福州网站建设H5全方位解决方案在数字化转型加速的今天,H5(HTML5)网站建设已成为福州企业提升品牌形象、拓展获客渠道的核心手段,与传统的静态网页不同,H5网站具备强交互性、响应式布局和跨平台兼容性,能够确保用户在手机、平板、电脑等不同设备上获得一致且优质的浏览体验,为什么福州企业需要升级为H5网站?全平台适……

    2026年7月14日
    1000
  • 服务器root密码到底有什么用?,怎么设置root密码

    服务器root密码是Linux系统最高权限的管理员密码,用于完全控制服务器的所有资源与操作,是运维管理的核心凭证,服务器root权限有什么用?核心管理能力解析root账户在Linux系统中拥有不受限制的权限,业内专家指出,它相当于Windows系统的Administrator账户但控制力更强,掌握root密码意……

    2026年7月29日
    1500
  • 服务器访问人太多卡死怎么办?瞬间流量过大崩溃解决方案

    核心问题与专业应对之道服务器瞬间访问量过大(高并发冲击)的核心问题在于:系统的资源供应(CPU、内存、带宽、数据库连接、I/O处理能力等)在极短时间内无法满足突增的需求,导致服务响应延迟、错误率飙升,甚至完全崩溃, 这并非简单的流量问题,而是资源分配失衡、架构弹性不足、预警机制失效的综合体现, 流量洪峰:从何而……

    2026年2月9日
    17200
  • 服务器排插品牌有哪些

    APC、罗格朗、克莱沃、突破、大唐保镖是目前市面上最主流的几个品牌,选型时按“机房等级、单路功率、管理功能”三件事去套,基本不会买错,先弄清楚服务器排插到底是什么业内叫它PDU(Power Distribution Unit),也就是电源分配单元,它和普通插座的区别在于,服务器排插是按机柜U位高度设计的,常见1……

    2026年9月7日
    600
  • GPU云服务器限时秒杀真的划算吗?云服务器租用价格

    GPU云服务器限时秒杀活动是当前降低AI算力成本、加速模型训练与推理部署的最佳窗口期,建议立即锁定高配实例以抢占资源红利,在人工智能爆发式增长的2026年,算力已成为企业数字化转型的核心基础设施,对于初创团队、独立开发者以及需要弹性扩容的中大型企业而言,高昂的GPU实例租赁费用往往是阻碍业务落地的最大痛点,此次……

    2026年6月25日
    3000

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注