Flask框架如何使用ORM连接数据库?,有哪些方法
- 云服务器
- 2026-07-25
- 5
在Flask框架中,使用ORM(对象关系映射)连接和操作数据库是现代Web开发的标准做法,ORM允许开发者使用Python类和对象来操作数据库,而无需编写原始的SQL语句,从而提高开发效率和代码可维护性,在Flask生态中,Flask-SQLAlchemy 是最流行且官方推荐的ORM扩展库。
环境准备与安装
在开始之前,需要确保已经安装了Flask和Flask-SQLAlchemy,如果使用MySQL或PostgreSQL,还需要安装相应的数据库驱动。
- 安装核心依赖:pip install Flask Flask-SQLAlchemy
- 安装MySQL驱动(以PyMySQL为例):pip install PyMySQL
配置数据库连接
在Flask应用中,需要通过配置项告诉Flask-SQLAlchemy如何连接数据库,最核心的配置是 SQLALCHEMY_DATABASE_URI,它包含了数据库类型、用户名、密码、主机地址和数据库名。

以下是常见数据库的连接URI格式对比:
| 数据库类型 | 连接URI格式 | 备注 |
|---|---|---|
| SQLite | sqlite:///app.db | 三个斜杠表示相对路径,四个斜杠表示绝对路径 |
| MySQL | mysql+pymysql://user:password@host:port/dbname | 需要安装 pymysql 或 mysqlclient |
| PostgreSQL | postgresql://user:password@host:port/dbname | 需要安装 psycopg2 |
初始化与定义模型
配置好连接后,需要在Flask应用中初始化SQLAlchemy实例,并定义数据模型(即数据库表结构)。

创建数据库和表
在定义好模型后,可以通过Flask的交互式Shell或者代码直接创建对应的数据库表。
with app.app_context(): # 创建所有定义好的模型对应的表(如果表不存在) db.create_all() print("数据库表创建成功!")
执行CRUD操作
使用ORM进行增删改查(CRUD)操作非常直观,所有写操作都需要放在 数据库会话 中,并在最后提交。
- 增: with app.app_context(): new_user = User(username='张三', email='zhangsan@example.com') db.session.add(new_user) db.session.commit()
- 查: with app.app_context(): # 查询所有用户 all_users = User.query.all() # 按主键查询 user = User.query.get(1) # 按条件查询(过滤) user_zhang = User.query.filter_by(username='张三').first()
- 改: with app.app_context(): user = User.query.get(1) user.email = 'new_email@example.com' db.session.commit()
- 删: with app.app_context(): user = User.query.get(1) db.session.delete(user) db.session.commit()
在路由中集成ORM
在实际开发中,通常会在视图函数中调用ORM来处理业务逻辑。

@app.route('/users', methods=['GET']) def get_users(): users = User.query.all() return {'users': [{'id': u.id, 'name': u.username} for u in users]} @app.route('/add_user', methods=['POST']) def add_user(): from flask import request username = request.json.get('username') email = request.json.get('email') if User.query.filter_by(username=username).first(): return {'error': '用户名已存在'}, 400 new_user = User(username=username, email=email) db.session.add(new_user) db.session.commit() return {'message': '用户添加成功', 'id': new_user.id}, 201
相关问题与解答
问题1:在开发过程中,如果模型发生了改变(例如新增了字段),如何安全地更新数据库表结构而不丢失原有数据?
解答:使用 db.create_all() 只能在表不存在时创建表,它不会修改已有表的结构,为了安全地迁移数据库,推荐使用 Flask-Migrate 扩展,它基于Alembic,能够自动生成迁移脚本并执行,操作步骤如下:
- 安装:pip install Flask-Migrate
- 初始化:在代码中引入 Migrate(app, db)
- 在命令行执行:
- flask db init(初始化迁移文件夹,只需执行一次)
- flask db migrate -m "add new field"(生成迁移脚本)
- flask db upgrade(应用迁移到数据库)
问题2:Flask-SQLAlchemy中的 SQLALCHEMY_TRACK_MODIFICATIONS 配置项有什么作用?为什么建议设置为 False?
解答:SQLALCHEMY_TRACK_MODIFICATIONS 用于决定是否追踪对象的修改状态,如果设置为 True(在旧版本中是默认值),Flask-SQLAlchemy 会为每个对象增加一个额外的信号监听器,以便在对象属性被修改时发送信号,这会消耗额外的系统内存和CPU资源,在绝大多数应用中,我们不需要这种信号追踪功能,因此官方强烈建议将其设置为 False,以提升应用性能并减少不必要的内存开销。