Flask框架结合Flask-SQLAlchemy进行数据库操作的完整指南
本文详解Flask框架下使用Flask-SQLAlchemy进行数据库管理的完整流程。内容涵盖ORM概念解析、数据库连接配置(MySQL/SQLite)、字段与关系选项定义,以及基于db.session的增删改查实现。重点介绍查询过滤器(filter、order_by等)与执行器(all、first、paginate等)的具体用法,帮助开发者高效构建Web应用数据层。
本文详细介绍Python Web框架Flask中数据库操作的基础方法,旨在为读者提供实用的参考案例。
在Web开发领域,数据库操作至关重要,许多核心数据如用户名、密码等均需持久化存储。Django框架基于MVT架构,内置了Model类供直接继承;而Flask并未内置此类封装,需借助扩展库Flask-SQLAlchemy。该扩展提供了数据库抽象层,使开发者无需手动编写SQL语句,而是通过其接口操作数据库。这一机制的核心思想是ORM(对象关系映射),下文将对此进行深入解析。
一、ORM基础概念
1. ORM全称为Object Relationship Map(对象-关系映射),其核心功能是将模型对象映射到关系型数据库数据。简而言之,即通过操作对象来间接操作数据库。
2. 操作流程示意图:

3. 主要优势:
(1). 无需编写底层SQL代码,开发者可专注于业务逻辑的实现。
(2). 通过对象方式操作数据库,实现数据模型与数据库结构的解耦,提升开发效率。
4. 局限性:
性能相对较低。
二、Flask-SQLAlchemy配置与使用
1. 配置信息设置
开发实践中,通常将配置信息独立存放于单独文件(如settings.py)中,以保障安全信息的隔离与保护。
关键配置字段说明:
数据库连接通过URL指定,格式为:'mysql://用户名:密码@服务器地址:端口号/数据库名';若使用SQLite,格式为:sqlite:////absolute/path/to/foo.db(注意以////开头)。
SQLALCHEMY_DATABASE_URI = 'myslq://root:meiyou@127.0.0.1:3306/test' SQLALCHEMY_POOL_RECYCLE:设置连接自动回收的时间(秒),MySQL默认值为2小时。 SQLALCHEMY_ECHO:设为True时,查询过程会打印原始SQL语句。 SQLALCHEMY_TRACK_MODIFICATIONS:用于动态追踪修改设置。
2. 常用SQLAlchemy字段类型:
Integer String Numberic Boolean Date
3. 常用SQLAlchemy列选项:
primary_key:设为True表示定义为主键。Flask不自动生成主键,需手动指定。 unique:设为True表示该列值不可重复,常用于用户名、邮箱或手机号。 nullable:设为True允许字段为空。 default:设置字段默认值。 index:设为True表示创建索引,默认情况下主键即为索引。
4. 关系配置选项:
backref:在关联的另一模型中添加反向引用,对查询操作至关重要。 secondary:指定多对多关系中中间表的名称。 primary join:
三、Flask-SQLAlchemy基本操作实现
在Flask-SQLAlchemy中,数据的增、删、改由数据库会话(db.session)管理。在将数据写入数据库前,需先通过add()方法将数据加入会话,随后调用commit()提交会话。
查询操作均通过query对象执行。基础查询返回表内所有数据,也可利用过滤器进行更精确的检索。
1. 常用查询过滤器:
过滤器返回的仍是对象,需借助执行器获取实际数据。
filter():将过滤器添加至原查询,返回新查询,需通过模型类名获取字段进行比较。
filter_by():添加等值过滤器(仅支持=操作),返回新查询。
order_by():按指定条件对结果排序,返回新查询。
group_by():按指定条件对原查询结果分组,返回新查询。
2. 常用查询执行器:
all():以列表形式返回查询的所有结果。
first():返回查询的第一个结果。
first_or_404():同first(),若未找到则返回404错误。
get():返回指定主键对应的行。
get_or_404():返回指定主键对应的行,若不存在则返回404错误。
count():返回查询结果的数量。
paginate():返回包含指定范围结果的Paginate对象。
3. 查询条件用法:
startswith('xx'):查询以xx开头的所有数据。
endswith('xx'):查询以xx结尾的所有数据。
not_():取反操作。
and_():返回满足and()条件的所有数据。
or_():返回满足or()条件的所有数据。
示例代码:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from settings import Config
app = Flask(__name__)
app.config.from_object(Config)
# 创建数据库实例对象
db = SQLAlchemy(app)
class Role(db.Model):
"""创建角色模型类"""
__tablename__ = 'roles'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
# 描述roles表和users表的关系,
# 第一个参数为多那端的模型类名
# 第二个参数backref:为模型类名声明新属性,这样就可以实现反向查询
# 第三个参数决定了什么时候从数据库中查询数据
us = db.relationship('User', backref='role', lazy='dynamic')
def __repr__(self):
return 'Role:%s' % self.name
class User(db.Model):
"""创建用户模型类"""
# 设置表名
__tablename__ = 'users'
# 添加主键
id = db.Column(db.Integer, primary_key=True)
# 用户名
name = db.Column(db.String(30), unique=True)
email = db.Column(db.String(64), unique=True)
password = db.Column(db.String(64))
# 定义一个外键
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
def __repr__(self):
return 'User:%s' % self.name
if __name__ == '__main__':
# 先删除表
db.drop_all()
# 创建表
db.create_all()
# 添加数据
app.run()
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python+MySQL数据库程序设计入门教程》、《Python常见数据库操作技巧汇总》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述内容对大家的Python程序设计有所帮助。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









