尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Flask与MySQL数据库集成及ORM操作指南
1. Flask后端开发中的数据库连接与ORM操作在Web应用开发中数据库操作是核心功能之一。Flask作为轻量级Python Web框架与MySQL数据库的集成是开发者必须掌握的技能。使用ORM对象关系映射技术可以让我们用面向对象的方式操作数据库避免直接编写SQL语句提高开发效率和代码可维护性。2. 环境准备与依赖安装2.1 安装MySQL数据库首先需要确保MySQL数据库已正确安装并运行。可以从MySQL官网下载社区版按照官方文档完成安装。安装完成后创建一个新的数据库供Flask应用使用CREATE DATABASE flask_demo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;2.2 安装Python依赖包Flask连接MySQL需要安装以下Python包pip install flask flask-sqlalchemy pymysqlflask-sqlalchemyFlask的SQLAlchemy扩展提供ORM功能pymysqlPython的MySQL驱动3. Flask应用配置MySQL连接3.1 基本配置在Flask应用中配置MySQL连接字符串from flask import Flask from flask_sqlalchemy import SQLAlchemy app Flask(__name__) app.config[SQLALCHEMY_DATABASE_URI] mysqlpymysql://username:passwordlocalhost/flask_demo app.config[SQLALCHEMY_TRACK_MODIFICATIONS] False db SQLAlchemy(app)连接字符串格式为mysqlpymysql://用户名:密码服务器地址/数据库名3.2 配置注意事项生产环境中不要将密码硬编码在代码中应该使用环境变量设置SQLALCHEMY_TRACK_MODIFICATIONS为False以避免不必要的资源消耗对于UTF-8编码支持可以在URI中添加参数?charsetutf8mb44. 定义数据模型4.1 创建基础模型使用SQLAlchemy定义数据模型类class User(db.Model): id db.Column(db.Integer, primary_keyTrue) username db.Column(db.String(80), uniqueTrue, nullableFalse) email db.Column(db.String(120), uniqueTrue, nullableFalse) def __repr__(self): return fUser {self.username}4.2 字段类型与选项常用字段类型db.Integer整数db.String(size)字符串需指定最大长度db.Text长文本db.DateTime日期时间db.Boolean布尔值常用字段选项primary_key主键unique唯一约束nullable是否允许为空default默认值5. 数据库迁移与表创建5.1 初始化数据库首次使用时需要创建数据库表with app.app_context(): db.create_all()5.2 使用Flask-Migrate进行数据库迁移对于生产环境建议使用Flask-Migrate管理数据库变更pip install flask-migrate然后在应用中初始化from flask_migrate import Migrate migrate Migrate(app, db)使用命令进行迁移flask db init # 初始化迁移仓库 flask db migrate -m initial migration # 创建迁移脚本 flask db upgrade # 应用迁移6. ORM增删改查操作6.1 创建记录Createnew_user User(usernamejohn, emailjohnexample.com) db.session.add(new_user) db.session.commit()6.2 查询记录Read基本查询# 获取所有用户 users User.query.all() # 获取单个用户 user User.query.get(1) # 通过主键查询 # 条件查询 user User.query.filter_by(usernamejohn).first()复杂查询# 多条件查询 users User.query.filter(User.username.like(%j%), User.email.endswith(example.com)).all() # 排序 users User.query.order_by(User.username).all() # 分页 users User.query.paginate(page1, per_page10)6.3 更新记录Updateuser User.query.get(1) user.email new_emailexample.com db.session.commit()6.4 删除记录Deleteuser User.query.get(1) db.session.delete(user) db.session.commit()7. 高级ORM功能7.1 关系模型定义一对多关系class Post(db.Model): id db.Column(db.Integer, primary_keyTrue) title db.Column(db.String(120), nullableFalse) content db.Column(db.Text, nullableFalse) user_id db.Column(db.Integer, db.ForeignKey(user.id)) author db.relationship(User, backrefdb.backref(posts, lazyTrue))7.2 事务处理使用事务确保数据一致性try: # 操作1 db.session.add(obj1) # 操作2 db.session.delete(obj2) db.session.commit() except: db.session.rollback() raise7.3 批量操作提高批量插入性能users [User(usernamefuser{i}) for i in range(100)] db.session.bulk_save_objects(users) db.session.commit()8. 性能优化与最佳实践8.1 查询优化使用lazydynamic延迟加载大关系集合只查询需要的字段User.query.with_entities(User.username)使用joinedload避免N1查询问题8.2 连接池配置app.config[SQLALCHEMY_POOL_SIZE] 20 app.config[SQLALCHEMY_POOL_TIMEOUT] 30 app.config[SQLALCHEMY_POOL_RECYCLE] 36008.3 常见问题解决连接超时调整连接池参数或检查网络编码问题确保数据库、连接字符串和表都使用UTF-8编码性能瓶颈使用EXPLAIN分析慢查询9. 完整示例代码from flask import Flask from flask_sqlalchemy import SQLAlchemy app Flask(__name__) app.config[SQLALCHEMY_DATABASE_URI] mysqlpymysql://user:passwordlocalhost/flask_demo app.config[SQLALCHEMY_TRACK_MODIFICATIONS] False db SQLAlchemy(app) class User(db.Model): id db.Column(db.Integer, primary_keyTrue) username db.Column(db.String(80), uniqueTrue, nullableFalse) email db.Column(db.String(120), uniqueTrue, nullableFalse) def __repr__(self): return fUser {self.username} # 创建表 with app.app_context(): db.create_all() # 示例路由 app.route(/add_user/username/email) def add_user(username, email): new_user User(usernameusername, emailemail) db.session.add(new_user) db.session.commit() return fAdded user {username} app.route(/users) def list_users(): users User.query.all() return br.join([str(user) for user in users]) if __name__ __main__: app.run(debugTrue)10. 实际开发中的经验分享模型设计时考虑好索引常用查询条件应该建立索引生产环境一定要使用数据库连接池复杂的查询可以考虑使用原生SQL通过db.session.execute()执行定期维护数据库包括优化表、备份数据等使用flask-sqlalchemy的get_or_404方法可以简化错误处理在大型项目中可以考虑将模型定义放在单独的文件中并使用蓝图组织路由。对于更复杂的业务逻辑可以引入服务层来封装数据库操作保持视图函数的简洁性。
RELATED

相关推荐

服务器持续监听实战:accept循环、backlog与事件驱动

服务器持续监听实战:accept循环、backlog与事件驱动

标题里这个"13.6"看着像课程章节号,但内容本身是老话题:一个服务器写完了 bind、listen、accept,跑起来只能接一个客户端,接完就退出,或者第二个客户端连上来就卡死。这几乎是每个学网络编程的人都会撞的第一…

📅 2026/10/26 4:49:21
uIP源码解析:2KB RAM单片机TCP/IP移植与排错

uIP源码解析:2KB RAM单片机TCP/IP移植与排错

简介:面向嵌入式网络开发初学者与需要为资源受限设备接入网络的工程师,这套uIP协议栈源码是理解轻量级TCP/IP实现机制的实用样本。包内共304个文件,其中29个c源文件与34个h头文件构成协议主体,183个html、3个css及若干png、gif图片…

📅 2026/10/26 4:44:20
零基础学AI应用开发:从Python到大模型API的实战路线

零基础学AI应用开发:从Python到大模型API的实战路线

不想劝退任何一个零基础的人,但我也必须说实话:AI应用开发这条路,现在确实比过去任何时候都更适合新人走。前提是,你得先把“AI应用开发”这件事理解对。很多初学者一听到“AI”两个字,脑子里浮现的是数学公式、神经网…

📅 2026/10/26 4:44:20
MORE NEWS

更多资讯

📰

Windows开机加速:5种启动项管理方法详解

1. 为什么Windows开机越来越慢?每次按下电源键后,看着屏幕上转圈的加载图标,是不是感觉等待时间越来越长?这个问题困扰着绝大多数Windows用户。开机速度变慢的核心原因,往往在于系统启动时自动加载的程序过多。这些程序…

📰

Edge兼容性修复实战:从翻车到可复现的完整指南

1. 从一次真实的翻车现场说起上个月帮一个朋友处理他公司内网系统的问题,前端同事信誓旦旦说"Chrome上跑得好好的",结果业务部门清一色用Windows自带的Edge打开,页面直接白屏,控制台一片红。这不是个例,我在…

📰

Aspose.Words for Java 14.9 离线破解版技术解析

简介:本资源是面向Java开发者与后端工程师的Aspose Words for Java 14.9破解版工具包,专为需在非商业场景下实现Word文档自动化处理(如生成报告、批量替换、格式转换、页眉页脚操作等)的技术人员设计。资源包含3个核心文件&#x…

📰

企业微信 iPad 方案怎么选?官方 API、自动化能力与风险边界

企业微信 iPad 方案怎么选?官方 API、自动化能力与风险边界 摘要 围绕“企业微信 iPad 协议”的讨论,常把设备形态、客户端自动化和企业级接口混在一起。选方案时更重要的问题不是能不能模拟某个客户端,而是业务是否获得了明确授权、数据能否…

📰

YOLOv10与红外成像在太阳能板缺陷检测中的应用

1. 项目概述:红外太阳能板缺陷检测的智能化突破去年夏天参观光伏电站时,现场工程师指着成排的太阳能板告诉我:"人工巡检2000块板子需要3个人忙活一整天,最头疼的是细微裂纹和热斑,等肉眼能看见时往往已经造成发电…

📰

PyTorch安装验证全链路指南:CUDA、驱动、Python版本精准校准

1. 这不是“点几下就完事”的安装,而是深度学习环境的第一道门槛 PyTorch 安装与验证,听起来像教科书里最基础的一节,但实际操作中,它往往是新手掉进的第一个深坑——你以为只是执行一条 pip install torch ,结果卡…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬