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://test.idctop.com/article/559133.html

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

相关推荐

  • 服务器控制终端框架怎么选?服务器控制终端框架哪个好用

    服务器控制终端框架的构建核心在于实现高效、安全且可扩展的远程管理能力,其本质是通过标准化的协议与模块化设计,解决异构环境下的运维痛点,一个优秀的框架不仅能降低运维成本,更能通过自动化机制保障业务连续性,是企业数字化基础设施的神经中枢,架构设计原则:模块化与解耦服务器控制终端框架的稳定性取决于底层架构的合理性,传……

    2026年3月12日
    12600
  • Hudson Python怎么配置?Hudson集成Python环境教程

    Hudson结合Python进行CI/CD自动化构建,核心在于利用其强大的插件生态与Python脚本的灵活性,实现从代码提交到部署的全流程自动化,显著降低人工干预成本并提升发布效率,在DevOps实践中,开发者常面临构建环境不一致、部署流程繁琐等痛点,Hudson作为老牌持续集成工具,虽然界面略显陈旧,但其稳定……

    2026年7月4日
    16700
  • 高清网络服务器有哪些知名品牌和型号,哪个好

    高清网络服务器的选择直接关系到视频业务的流畅度与稳定性,目前市场主流方案包括自建服务器托管与云服务器两大类,其中持牌自营机房的服务商在保障网络质量上更具优势,高清网络服务器到底指什么高清网络服务器并非一个严格的硬件分类,而是指专门用于处理高清视频流数据的服务器,它承担着视频的采集、编码、存储、分发等工作,在直播……

    2026年8月13日
    100
  • 服务器平台操作系统类型有哪些,服务器系统怎么选择好

    服务器平台操作系统的选型直接决定了企业IT基础设施的稳定性、安全性及运维成本,在数字化转型的浪潮中,选择合适的操作系统不仅是技术决策,更是关乎业务连续性的战略考量,核心结论在于:当前服务器操作系统市场呈现Windows Server与Linux双足鼎立的局面,企业应依据应用架构、技术栈兼容性及运维能力,在稳定性……

    2026年4月5日
    9000
  • python挂起怎么操作?python挂起线程方法

    在Python开发中,”挂起”通常指使用threading.Event或queue机制暂停线程执行以等待特定条件,而非直接终止进程;对于需要长时间运行的任务,推荐使用asyncio.sleep()或外部调度工具如Celery来管理状态,很多开发者在编写自动化脚本或后台服务时,都会遇到程序”卡住”或者需要”暂停……

    2026年7月10日
    17400
  • Python Jupyter怎么用,Jupyter怎么安装?

    Jupyter Notebook 是基于 Web 的交互式计算环境,通过将代码、文本、数学公式和可视化结果集成在单一文档中,成为数据科学、机器学习及科研领域进行 Python 快速原型开发与数据分析的核心工具,为什么数据科学家首选 Python Jupyter 环境在进行数据探索性分析(EDA)时,开发者往往需……

    2026年7月14日
    800
  • 云裳羽衣服务器有哪些?,哪个区服人最多?

    云裳羽衣的服务器体系由官方服与渠道服构成,官方服按平台分为iOS大区和安卓大区,渠道服则随应用商店接入而独立划分,各服务器间数据不互通,下文按游戏实际运营情况,逐一梳理服务器构成、选区逻辑与维护要点,帮你快速定位自己所在的区服,官方服务器:iOS与安卓双端大区全貌云裳羽衣在公测初期的服务器规划逻辑,与大部分中式……

    2026年8月23日
    200
  • 高级大数据开发招聘信息有哪些?大数据开发岗位哪里找

    2026年高级大数据开发招聘的核心逻辑已从单纯的“海量数据处理”转向“AI驱动的数据资产化与实时智能决策”,企业急需具备流批一体架构、大模型数据工程及数据治理复合能力的高端人才,2026高级大数据开发招聘市场洞察行业需求与薪资基准据中国信息通信研究院2026年《数据要素市场化发展白皮书》显示,随着大模型落地进入……

    2026年4月28日
    6300
  • 服务器搭建mongo详细教程,如何在服务器上安装MongoDB?

    在Linux服务器环境中构建高性能、高可用的MongoDB数据库,核心在于正确选择版本、精细化配置系统参数以及严格落实安全认证机制,一个生产级别的MongoDB实例,绝非简单的“解压即运行”,而是需要通过系统层面的资源限制优化、存储引擎配置以及访问权限控制,来确保数据的一致性与服务的稳定性, 成功的部署方案必须……

    2026年3月4日
    12500
  • 客户机和服务器有哪些主要区别?,怎么区分?

    客户机与服务器是网络架构的两大核心角色,客户机发起请求,服务器响应处理,常见的客户机包括个人电脑、移动设备、瘦客户机等;服务器则按物理形态分为塔式、机架式、刀片式,按功能分为Web服务器、数据库服务器、文件服务器等,选择时需考虑业务需求与服务商资质,客户机的主要类型与演进客户机是用户直接操作的设备,其类型随技术……

    2026年8月6日
    800

发表回复

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