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,会触发多次查询,解决方案是使用joinedloadsubqueryload

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_recyclepool_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

相关推荐

  • 服务器怎么执行脚本?服务器运行脚本的步骤详解

    服务器执行脚本的本质,是操作系统内核根据脚本文件的“解释器声明”或“执行权限”,调用相应的解释器程序(如Bash、Python、PHP),将脚本内的逻辑指令逐行翻译为机器码,并由CPU调度资源完成特定任务,这一过程并非简单的“打开文件”,而是涉及权限校验、环境加载、进程创建和资源回收的严谨系统工程,核心结论:服……

    2026年3月16日
    11900
  • 为什么服务器端口无法连接?监听配置教程详解

    服务器监听端口是网络通信中的核心组件,用于接收和响应来自客户端的连接请求,它充当服务器的“门卫”,确保数据流有序传输,支持各类应用如网站、数据库和API的运行,正确配置和管理端口不仅能提升系统效率,还能防范安全漏洞,服务器监听端口的基本概念服务器监听端口是一个数字标识符(范围0-65535),绑定到特定IP地址……

    2026年2月9日
    12230
  • 个人博客数据库怎么设计?个人博客数据库设计最佳实践

    体量选择关系型数据库(如MySQL)或文档型数据库(如MongoDB),并遵循范式化原则确保数据一致性,同时通过索引优化查询性能,搭建个人博客看似只是写几篇文章,实则背后有一套精密的数据流转系统,很多初学者容易陷入“为了技术而技术”的误区,盲目追求高深架构,却忽略了博客本质是内容载体,数据库作为博客的“记忆中枢……

    2026年6月12日
    3510
  • 佛山智唯网站建设公司怎么样,网站建设哪家好?

    佛山智唯网站建设凭借标准化的建站流程和清晰的报价体系,解决了中小企业建站时“价格不透明、沟通成本高”的痛点,这是其获得市场认可的关键,佛山智唯网站建设价格与性价比分析对于大多数企业主来说,建站成本是首要考量,智唯在佛山市场推出的套餐覆盖了从基础展示型到高级营销型的不同需求,价格区间大致在数千元到万元级,与其竞争……

    2026年7月18日
    1400
  • 服务器就是挂机宝吗?服务器和挂机宝有什么区别

    服务器绝对不等同于挂机宝,两者在性能定位、使用场景、技术架构及服务等级协议上存在本质区别,将二者混为一谈极易导致业务选型错误,进而引发数据丢失或业务中断的风险,服务器通常指独立服务器或高性能云服务器,具备独享资源、高稳定性及强大的计算能力,旨在支撑核心业务长久运行;而挂机宝多为共享资源的虚拟机或VPS,侧重于低……

    2026年4月11日
    6800
  • 服务器如何开放外网访问?服务器开放外网访问安全设置方法

    服务器开放外网访问是一项高风险与高收益并存的技术操作,其核心原则必须遵循“最小权限原则”与“深度防御策略”,在确保业务连续性的前提下,必须将安全防护置于首位,任何忽视安全配置的端口开放都可能导致服务器沦为肉鸡或数据泄露的源头, 成功的实施路径并非简单的防火墙配置,而是一个包含网络规划、权限管控、加密传输及持续监……

    2026年3月27日
    8900
  • J2EE的应用服务器有哪些值得推荐,哪个最稳定

    J2EE应用服务器是企业级Java应用的核心支撑,主流产品包括Apache Tomcat、IBM WebSphere、Oracle WebLogic、JBoss(WildFly)、GlassFish、Jetty,选择需根据项目规模、性能要求和预算综合决定,j2ee应用服务器有哪些主流选择在J2EE生态中,不同应……

    2026年7月23日
    500
  • 服务器怎么分磁盘,服务器磁盘分区详细步骤教程

    服务器磁盘分区的核心原则在于平衡性能、安全性与业务扩展性,最佳实践是采用“系统与数据分离、日志与数据分离”的策略,避免将所有资源堆积在一个分区中,合理的磁盘分区方案不仅能提升服务器的I/O处理效率,还能在系统崩溃或数据损坏时最大限度地保障数据安全,降低维护成本, 服务器磁盘分区前的核心规划在执行分区操作前,必须……

    2026年3月21日
    13600
  • Python之路怎么入门?,Python怎么学

    Python学习路径的核心是基础语法、项目实战和持续积累,选择自学还是培训取决于个人学习习惯和预算,据行业报告,一线城市Python开发初级岗位月薪普遍在8k-15k之间,Python学习路线图:从零基础到项目实战对于初学者来说,最困惑的是“先学什么,再学什么”,业内专家建议,将学习过程拆解为三个阶段,每个阶段……

    2026年7月20日
    400
  • 服务器怎么切换?服务器切换操作步骤详解

    服务器切换是一项高风险、高技术含量的运维操作,其核心在于“数据一致性”与“服务连续性”的保障,成功的切换不仅仅是硬件或IP地址的变更,而是通过严谨的流程控制,将业务从源环境平滑迁移至目标环境,确保用户无感知、数据零丢失, 整个过程必须遵循“备份先行、分步实施、验证回滚”的原则,任何忽视细节的操作都可能导致严重的……

    2026年3月20日
    11300

发表回复

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