Flask 数据库集成实战:从配置到 CRUD 操作

陈默
陈默
发布时间:2026-10-15 | 4人浏览过
原创

本文详细介绍如何在 Flask 应用中集成数据库支持。通过 Flask-SQLAlchemy 插件,开发者可以简化数据库连接与模型定义。文章涵盖 SQLite 配置、数据模型创建、数据库表生成以及完整的增删改查(CRUD)操作示例,并演示如何在视图函数中处理数据库交互,为 Web 应用提供坚实的数据存储基础。

前言:

数据库构成了绝大多数 Web 应用的核心基础设施。任何涉及数据存储的需求都必然依赖数据库,接下来我们将共同探讨如何为 Flask 应用添加完善的数据库支持。

1、使用Flask-SQLAlchemy管理数据库

Flask-SQLAlchemy 深度集成了 SQLAlchemy,它极大地简化了连接数据库服务器、管理数据库实例以及操作会话等复杂工作。这使得 Flask 应用能够更便捷地进行数据存储与处理。开发者无需过多关注原生 SQL 语句,只需利用 Python 类即可轻松完成对数据库表的增删改查(CRUD)操作。此外,该插件兼容多种数据库类型,包括 MySQL、PostgreSQL 和 SQLite 等。

我们可以使用 pip install flask-sqlalchemy 命令进行安装。

1.1 配置Flask_SQLAlchemy

本节以 SQLite 数据库为例进行说明。Flask-SQLAlchemy 数据库的连接 URL 通过配置变量 SQLALCHEMY_DATABASE_URI 进行指定。随后,通过 Flask-SQLAlchemy 提供的 SQLAlchemy 类将配置传入 Flask 的实例 app,从而创建 db 实例。该 db 对象代表了程序所使用的数据库,并能够调用 Flask-SQLAlchemy 提供的所有功能。


from flask import Flask

from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

basedir = os.path.abspath(app.root_path)

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'data.db')

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)

其中,SQLALCHEMY_TRACK_ MODIFICATIONS 配置变量用于控制是否追踪对象的修改,在此示例中将其设置为 False。

1.2 定义数据库模型

数据模型即用于映射数据库表的 Python 类。一个数据模型类对应数据库中的一个表,而类的属性则代表数据库表的字段。所有模型类均需继承 Flask-SQLAlchemy 提供的 db.Model 基类。

新建 model.py 文件,定义 User 类如下:


from app import db

class User(db.Model):

    id = db.Column(db.Integer, primary_key=True)

    user_name = db.Column(db.String)

    password = db.Column(db.String)

1.3 创建数据库和表

运行 Flask 应用后,在终端中输入 flask shell 命令,即可进入 Python 交互环境。

执行结果如下所示:


>>> from app import db  # 从app.py中导入db实例

>>> from model import *  # 从model.py中导入所有模型类

>>> db.create_all()  # 用db.create_all()创建数据库表 

执行上述操作后,会在项目根目录生成一个 data.db 库文件。需要注意的是,数据库和表一旦创建,后续对模型类的修改(如添加或删除字段、修改字段名称及类型)不会自动同步到实际表中。例如,再次调用 db.create_all() 不会重新创建或更新表。只有通过 db.drop_all() 删除数据库中所有表,然后再调用 db.create_all(),才能重新创建表。

这就引出了一个关键问题:

若执行上述操作,数据库表将被删除并重建,导致表中原有数据全部丢失,这显然是不可接受的。因此,这里引入了数据库迁移的概念,具体实现将在下篇文章中详细介绍。

1.4 数据库操作

现在我们已经创建了模型,并生成了数据库和表,接下来学习常用的数据库操作。数据库操作主要涵盖 CRUD 流程,即 Create (创建)、Read (读取/查询)、Update (更新)和 Delete (删除)。

1.4.1 Create

向数据库添加一条记录,主要包含以下三个步骤:

  • 使用 Python 模型类创建对象,将其作为一条记录
  • 将新创建的对象添加到数据库会话中
  • 提交数据库会话

如下所示,在上面的交互环境下,创建一个新用户:


>>> from app import db  # 从app.py中导入db实例

>>> from model import User   # 导入模型类User

>>> user1=User(user_name='tigeriaf', password='123456')  # 创建用户1

>>> user2=User(user_name='admin', password='123456')  # 创建用户2

# 添加新创建的对象到数据库会话中

>>> db.session.add(user1)

>>> db.session.add(user2)

# 将数据库会话提交,数据写入data.db文件

>>> db.session.commit()

# 测试

>>> print(user1.id)

1

>>> print(user2.id)

2

此外,除了依次调用 add() 方法添加记录外,还可以使用 add_all() 一次性添加包含多个模型类对象的列表。

1.4.2 Read

使用模型类

提供的 query 属性,通过模型类提供的 query 属性附加调用各种过滤方法,可以查询数据库表的数据。

查询模式如下:

<模型类>.query.<过滤方法>.<查询方法>

从某个模型类出发,通过在 query 属性对应的 Query 对象上附加过滤方法和查询函数,对模型类对应的表中的记录进行各种筛选等操作。最终返回包含对应数据库记录数据的模型类实例,对返回的实例调用属性即可获取对应的字段数据。


# 查询全部

>>> User.query.all()

[<User 1>, <User 2>]

# 查询指定id的记录

>>> user1=User.query.get(1)

>>> user1.user_name

'tigeriaf'

# 查询条数

>>> User.query.count()

2

# 查询user_name为admin的用户

>>> User.query.filter_by(user_name='admin').all()

[<User 2>]

SQLAlcherny 提供了丰富的过滤方法,使用这些方法可以获取更精确的查询结果,此处不再展开。完整的查询和过滤方法请参阅:The Query Object。

1.4.3 Update

更新一条记录非常简单,只需直接给模型类的属性赋予新值,然后调用 commit() 方法提交会话即可。如下所示,将 id 为 2 的用户的用户名 user_name 进行修改。


>>> user2=User.query.get(2)

>>> user2.user_name

'admin'

>>> user2.user_name='张三'

>>> db.session.commit()

>>> user2.user_name

'张三'

1.4.4 Delete

使用 delete() 进行数据记录的删除,具体操作如下:


>>> db.session.delete(user2)

>>> db.session.commit()

>>> user2=User.query.get(2)

>>> print(user2)

None

1.4.5 在视图函数里操作数据库

在视图函数中操作数据库的方式与在 Python Shell 交互环境下大致相同,区别在于需要增加从请求对象获取数据及验证数据的步骤。

如下展示一个具体案例:


@app.route('/user', methods=['GET', 'POST'])

def user():

    if request.method == 'POST':

        user_name = request.form['user_name']

        password = request.form['password']

        user = User(user_name=user_name, password=password)

        db.session.add(user)

        db.session.commit()

        return 'user:{} add success! id:{}'.format(user_name, user.id)

    else:

        user_id = request.args.get('user_id')

        user = User.query.get(user_id)

        if user:

            return 'Hello user:{}!'.format(user.user_name)

        else:

            return 'failed'

上述代码中,视图函数 user 接受两种方式的请求,分别用于完成添加用户和查询用户的功能,并将接收到的数据存储在数据库中。

发送请求测试如下:

到此这篇关于 Flask 数据库集成的介绍的文章就介绍到这了,更多相关 Flask 数据库集成内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表