Flask-SQLAlchemy db 使用说明

db 对象(Flask-SQLAlchemy 实例)是数据库操作的核心入口,通过它可以完成 CRUD(增删改查)、事务管理、表结构操作等所有数据库相关任务。以下是具体使用方法和示例:

一、核心操作对象

db 对象的核心功能通过以下子对象 / 方法实现:

  • db.Model:所有数据模型的基类(用于定义表结构)。
  • db.session:数据库会话(用于执行增删改查、提交事务)。
  • db.Column:定义表字段(如 idusername)。
  • db.create_all() / db.drop_all():创建 / 删除所有表(基于模型定义)。

二、基本数据库操作(CRUD)

假设已定义 User 模型(继承 db.Model):

python

运行

复制代码
# app/models/user.py
from app import db

class User(db.Model):
    __tablename__ = "users"
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
1. 新增数据(Create)

通过 db.session.add() 添加记录,db.session.commit() 提交事务:

python

运行

复制代码
from app import db
from app.models.user import User

# 创建新用户对象
new_user = User(
    username="test_user",
    email="test@example.com"
)

# 步骤1:添加到会话(暂存内存,未写入数据库)
db.session.add(new_user)

# 步骤2:提交事务(写入数据库,此时才会生成id)
db.session.commit()

print(f"新增用户ID:{new_user.id}")  # 提交后可获取自增ID
2. 查询数据(Read)

通过模型类的 query 方法(继承自 db.Model)执行查询:

python

运行

复制代码
# 1. 查询所有记录
all_users = User.query.all()  # 返回列表,包含所有User对象
for user in all_users:
    print(user.username, user.email)

# 2. 按条件查询(单条记录)
user = User.query.filter_by(username="test_user").first()  # 返回第一个匹配对象
if user:
    print(f"找到用户:{user.username}")

# 3. 按主键查询(常用)
user = User.query.get(1)  # 查询id=1的用户,不存在返回None

# 4. 复杂条件查询(使用filter而非filter_by)
from sqlalchemy import or_
users = User.query.filter(
    or_(User.username == "test_user", User.email.endswith("@example.com"))
).all()  # 或条件:用户名是test_user 或 邮箱以@example.com结尾
3. 更新数据(Update)

先查询到对象,修改属性后提交事务:

python

运行

复制代码
# 步骤1:查询要更新的对象
user = User.query.get(1)
if not user:
    print("用户不存在")

# 步骤2:修改属性
user.email = "new_email@example.com"

# 步骤3:提交事务(自动更新数据库)
db.session.commit()
print(f"更新后邮箱:{user.email}")
4. 删除数据(Delete)

通过 db.session.delete() 移除记录,再提交事务:

python

运行

复制代码
# 步骤1:查询要删除的对象
user = User.query.get(1)
if not user:
    print("用户不存在")

# 步骤2:从会话中删除
db.session.delete(user)

# 步骤3:提交事务(数据库中删除记录)
db.session.commit()
print("用户已删除")

三、事务管理

db.session 内置事务支持,确保一组操作的原子性(要么全成功,要么全失败):

python

运行

复制代码
try:
    # 操作1:新增用户A
    user_a = User(username="a", email="a@test.com")
    db.session.add(user_a)
    
    # 操作2:新增用户B(假设邮箱重复,会触发唯一约束错误)
    user_b = User(username="b", email="a@test.com")  # 邮箱与user_a冲突
    db.session.add(user_b)
    
    # 提交事务:若任何一步失败,自动回滚
    db.session.commit()
    print("所有操作成功")
except Exception as e:
    # 发生错误时回滚(撤销所有未提交的操作)
    db.session.rollback()
    print(f"操作失败,已回滚:{str(e)}")

四、表结构操作

1. 创建所有表

基于模型类自动生成数据库表(首次运行时使用):

python

运行

复制代码
# 需在Flask应用上下文中执行(如create_app函数中)
with app.app_context():
    db.create_all()  # 检查并创建所有未存在的表
    print("表创建成功")
2. 删除所有表(谨慎使用!)

删除所有模型对应的表(数据会丢失):

python

运行

复制代码
with app.app_context():
    db.drop_all()  # 删除所有表
    print("表已删除")

五、高级操作

1. 分页查询

处理大量数据时使用分页:

python

运行

复制代码
page = 1  # 第1页
per_page = 10  # 每页10条
pagination = User.query.paginate(page=page, per_page=per_page)

# 获取当前页数据
users = pagination.items  # 列表:当前页的User对象
# 分页信息
print(f"总页数:{pagination.pages}")
print(f"总记录数:{pagination.total}")
print(f"是否有下一页:{pagination.has_next}")
2. 排序查询

按字段排序(升序 / 降序):

python

运行

复制代码
from sqlalchemy import desc

# 按username升序(默认)
users_asc = User.query.order_by(User.username).all()

# 按id降序(最新的在前)
users_desc = User.query.order_by(desc(User.id)).all()

六、注意事项

  1. 必须在应用上下文中操作 所有数据库操作(查询、提交等)必须在 Flask 应用上下文(app.app_context())中执行,否则会报错。例如在脚本中:

    python

    运行

    复制代码
    from app import create_app, db
    
    app = create_app()
    with app.app_context():  # 激活上下文
        # 在这里执行数据库操作(如查询、新增)
        users = User.query.all()
  2. 避免长时间未提交的会话 db.session 会保持数据库连接,长时间不提交(commit)或回滚(rollback)可能导致连接泄露,建议及时处理事务。

  3. 查询性能 复杂查询建议使用 db.session.execute() 直接执行 SQL 语句,例如:

    python

    运行

    复制代码
    result = db.session.execute("SELECT username FROM users WHERE id > :id", {"id": 5})
    for row in result:
        print(row.username)

总结

db 对象的使用遵循 "模型定义 → 会话操作 → 事务提交" 的流程:

  • 通过 db.Modeldb.Column 定义表结构;
  • 通过 db.session 执行增删改查;
  • 通过 commit()/rollback() 管理事务;
  • 通过 create_all()/drop_all() 管理表结构。

掌握这些操作后,即可完成绝大多数数据库交互需求。

相关推荐
FinTech老王1 小时前
集中式 vs 分布式数据库:金融用户如何选择?——金仓数据库的双架构实践与选型指南
数据库·分布式·金融
q***92512 小时前
MySQL 启动失败 (code=exited, status=1FAILURE) 异常解决方案
数据库·mysql
Leon-Ning Liu2 小时前
Oracle Data Guard Broker RedoRoutes 属性配置文档
数据库·oracle
JIngJaneIL2 小时前
远程在线诊疗|在线诊疗|基于java和小程序的在线诊疗系统小程序设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·小程序·毕设·在线诊疗小程序
川石课堂软件测试3 小时前
自动化过程中验证码的解决思路
数据库·python·功能测试·测试工具·单元测试·tomcat·自动化
IT利刃出鞘3 小时前
WordPress插件--Redis Object Cache对象缓存插件的用法
数据库·redis·缓存
面向星辰3 小时前
sql通配符(大量查找搜索索引)
数据库·sql
斐硕人3 小时前
SQL滚动求和
数据库·sql·mysql·maxcompute
爬山算法4 小时前
Redis(135)Redis的网络模型是什么?
网络·数据库·redis