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/flask%e6%80%8e%e4%b9%88%e8%bf%9e%e6%8e%a5mysql%e6%95%b0%e6%8d%ae%e5%ba%93%ef%bc%9f%ef%bc%8c%e8%bf%9e%e6%8e%a5%e4%b8%8d%e4%b8%8a%e6%80%8e%e4%b9%88%e5%8a%9e%ef%bc%9f/

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

相关推荐

  • 服务器怎么初始化失败?服务器初始化失败的原因和解决方法

    服务器初始化失败通常源于硬件资源冲突、系统镜像损坏、网络配置错误或驱动兼容性问题,解决的核心逻辑在于“最小化排查”与“分段验证”,即通过剥离非必要组件定位故障源,并重新构建基础运行环境,针对这一复杂故障,必须建立系统化的排查路径,才能在保障数据安全的前提下恢复服务,硬件资源分配与兼容性冲突硬件层面的虚拟化资源分……

    2026年3月16日
    10400
  • 服务器快照怎么弄?服务器快照备份操作步骤详解

    服务器快照的操作核心在于选择合适的时机、利用云平台控制台的自动化工具进行备份,并建立合理的保留策略,这是保障数据安全最高效、成本最低的方案,相比于传统的FTP下载或异地备份,快照采用增量备份技术,能在几分钟内完成整机数据的备份,且对业务运行几乎无影响,是现代服务器运维的“后悔药”, 为什么服务器快照是运维的核心……

    2026年3月24日
    10500
  • Python webservice怎么搭建?webservice接口调用方法

    Python Web Service的核心在于利用轻量级框架快速构建高并发、易维护的API接口,Flask适合灵活定制,Django适合全栈开发,FastAPI适合高性能场景,选择需结合项目规模与团队技术栈,在2026年的技术生态中,后端服务的构建逻辑已经发生了微妙但深刻的变化,开发者不再单纯追求“能用”,而是……

    2026年7月7日
    4700
  • 服务器怎么创建云主机,云主机搭建详细步骤教程

    创建云主机的本质是利用物理服务器的硬件资源,通过虚拟化技术分割成多个独立的虚拟运行环境,这一过程的核心在于选择合适的虚拟化平台、合理分配硬件资源以及配置网络环境,物理服务器是基础,虚拟化软件是核心,网络配置是关键,三者缺一不可, 前期准备与环境规划在执行具体操作前,必须对物理服务器进行严格的硬件评估和网络规划……

    2026年3月19日
    14100
  • 服务器开发是什么?服务器开发工程师做什么的?

    服务器开发是构建互联网服务底层架构的核心技术过程,其本质是通过编程手段实现数据的逻辑处理、存储管理与高效分发,确保软件系统在高并发环境下具备高可用性、高可靠性与可扩展性,这一领域不仅要求开发者掌握扎实的编程语言基础,更需具备系统架构设计能力与对底层网络协议的深刻理解,核心结论:服务器开发是互联网应用的“心脏”与……

    2026年3月29日
    8400
  • 高精版文字识别报价是多少?高精OCR识别怎么收费

    2026年高精版文字识别报价受调用频次、场景复杂度与部署方式三大核心变量影响,单次调用均价集中在0.008元至0.05元区间,私有化部署年费则在8万至50万元不等,企业需基于真实日调用量与字段精度需求精准选型,方可实现成本与效率的最优解,2026高精版文字识别报价核心逻辑高精版文字识别并非统一定价,其背后遵循严……

    2026年4月28日
    5400
  • 服务器找不到磁盘阵列怎么办?服务器磁盘阵列故障解决方法

    服务器启动后,在操作系统或RAID管理工具中无法识别到预期的磁盘阵列(RAID Group),这是一个严重影响业务运行的紧急故障,核心原因通常集中在物理连接问题、驱动程序/固件异常、RAID控制器配置丢失或初始化失败、以及操作系统层面的识别障碍几个关键环节,解决此问题需要系统性地排查硬件、固件、驱动和配置, 物……

    2026年2月7日
    13330
  • 八千块服务器有哪些配置可选,哪款性价比最高

    八千块预算买服务器,核心答案是:你买不到一台能扛住高并发的物理机整机,但能买到一台配置够用的入门级机架式服务器(比如一颗至强银牌、32GB内存、4TB存储),或者直接租一台同配置的云服务器,后者更省心,这个预算卡得很微妙,比上不足比下有余,你要是直接去电商平台搜“服务器”,跳出来的多半是二手洋垃圾或者配置虚高的……

    2026年9月18日
    300
  • 高级网络管理员实操题考什么?高级网络管理员实操考试内容有哪些

    攻克高级网络管理员实操题的核心在于将动态路由策略、高可用集群与自动化运维深度融合,以实战场景驱动排障逻辑,方能在2026年考场与企业真实架构中游刃有余,2026年高级网络管理员实操考核底层逻辑重构考纲演变与行业数据印证传统“敲命令式”实操已遭淘汰,据中国计算机技术职业资格网2026年评测报告显示,78%的实操考……

    2026年4月24日
    5000
  • GPU服务器购买怎么样?2026年GPU服务器推荐

    购买GPU服务器需综合考量算力需求、预算限制及部署场景,核心建议是:初创团队首选云端按需实例以规避硬件折旧,成熟企业或特定高负载场景则建议自建或租赁裸金属服务器以获取极致性能与成本可控性,在2026年的技术语境下,算力已不再是单纯的硬件堆砌,而是决定业务迭代速度的核心引擎,无论是训练大语言模型、渲染超高清视频……

    2026年6月25日
    3000

发表回复

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