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

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

相关推荐

  • 中山服务器运维有哪些,需要注意什么?

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

    2026年8月13日
    100
  • IPv6服务器都分布在哪些国家?,哪个国家速度最快?

    IPv6服务器在全球的分布主要集中在北美、欧洲和亚太地区,其中美国、中国、德国、日本、英国占据主导地位,中国在IPv6大规模部署上已处于世界前列,国内运营商和IDC服务商提供的IPv6资源日益丰富,全球IPv6服务器分布区域分析北美地区:IPv6先发优势明显北美是全球IPv6部署最早也是最成熟的区域,美国作为互……

    2026年8月8日
    600
  • 应用服务器网站有哪些值得推荐的,哪个最好用

    应用服务器网站主要分为应用服务器软件官方平台和提供托管部署的云服务商,选择时需结合软件兼容性与服务商资质,简米科技与酷番云作为持牌服务商,在合规与运营经验上具备明显优势,应用服务器软件与托管服务的基础认知应用服务器软件有哪些应用服务器是承载业务逻辑的中间件,常见软件包括:Apache Tomcat:开源轻量级……

    2026年8月22日
    300
  • 安徽v5服务器经销商有哪些值得信赖的,哪家性价比高

    安徽v5服务器经销商主要分布在合肥、芜湖等城市,以华为、戴尔、惠普等品牌的授权经销商和本地系统集成商为主,正规渠道包括厂商官网查询授权名单、本地大型IT分销商以及具备资质的中小服务商,安徽v5服务器经销商有哪些?官方渠道与本地服务商一览华为v5服务器安徽授权经销商华为FusionServer Pro V5系列在……

    2026年7月24日
    400
  • 服务器开模拟器卡吗?服务器开模拟器卡顿怎么解决

    服务器开模拟器的核心价值在于实现业务场景的高保真预演与低成本试错,通过构建与生产环境高度一致的虚拟平台,企业能够在不影响实际业务的前提下完成系统测试、压力模拟及应急演练,这一过程不仅大幅降低了硬件投入成本,更显著提升了业务上线后的稳定性与安全性,是现代化运维体系中不可或缺的关键环节,核心优势:降本增效与风险可控……

    2026年3月26日
    10300
  • 个人域名企业能用吗?企业注册域名需要哪些资质

    个人域名企业能用,但仅限非核心业务或测试场景,核心品牌资产强烈建议使用企业实名认证域名以保障合规性与信任度,很多初创团队或自由职业者为了节省成本,会先注册一个便宜的 .com 或 .cn 域名,发现个人就能注册,于是想直接拿来当公司官网,这种做法在技术上行得通,但在商业逻辑和搜索引擎优化(SEO)层面,存在巨大……

    2026年6月11日
    4200
  • 服务器开启不了任务管理器怎么办?任务管理器被禁用的解决方法

    服务器无法开启任务管理器,通常由系统资源耗尽、组策略限制、病毒感染或核心进程冲突导致,需通过组合键、命令行、策略编辑器或注册表修复逐一排查并解决,针对这一故障,切勿盲目强制重启服务器,应根据具体的报错现象或无响应状态,采取分层递进的技术手段进行修复,以保障业务数据的完整性与服务的连续性,核心原因分析与紧急应对策……

    2026年3月28日
    9700
  • 跨3b有哪些服务器

    跨3b服务器组是《梦幻西游》电脑版跨服联赛中的第三组B分区,包含紫禁城、生日快乐、2008、钓鱼岛、西栅老街、曲阜孔庙、兰亭序、将军、再续前缘等服务器,具体名单以游戏内官方公告或跨服使者界面为准,跨3b服务器组的定义与背景跨3b是《梦幻西游》电脑版跨服玩法中的分组编号,全称“跨服3组B组”,游戏将全部服务器按实……

    2026年8月13日
    800
  • 服务器开关在哪里?服务器电源开关位置图解

    服务器的物理位置直接决定了业务系统的物理安全等级、网络连接质量以及后期运维管理的效率,是IT基础设施部署中最为关键的决策因素,将服务器部署在专业的数据中心或标准机房,而非普通的办公环境,是保障服务器稳定运行的核心结论,这一决策不仅关乎硬件寿命,更直接影响数据资产的安全性与业务的连续性,正确的服务器开关位置选择……

    2026年4月9日
    7200
  • 为什么需要服务器监控?揭秘服务器宕机对企业业务的影响

    企业数字生命线的守护系统服务器监控绝非简单的技术运维环节,它是维系企业在线业务生命力、保障核心数据资产安全、驱动决策智能化的关键基础设施,在数字化深度渗透的今天,忽视其价值等同于在数字洪流中蒙眼航行,随时面临触礁风险,业务连续性的守护神:杜绝宕机黑洞实时故障闪电定位: 完善的监控体系如同7×24小时无休的哨兵……

    2026年2月9日
    13200

发表回复

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