db 对象(Flask-SQLAlchemy 实例)是数据库操作的核心入口,通过它可以完成 CRUD(增删改查)、事务管理、表结构操作等所有数据库相关任务。以下是具体使用方法和示例:
一、核心操作对象
db 对象的核心功能通过以下子对象 / 方法实现:
db.Model:所有数据模型的基类(用于定义表结构)。db.session:数据库会话(用于执行增删改查、提交事务)。db.Column:定义表字段(如id、username)。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()
六、注意事项
-
必须在应用上下文中操作 所有数据库操作(查询、提交等)必须在 Flask 应用上下文(
app.app_context())中执行,否则会报错。例如在脚本中:python
运行
from app import create_app, db app = create_app() with app.app_context(): # 激活上下文 # 在这里执行数据库操作(如查询、新增) users = User.query.all() -
避免长时间未提交的会话
db.session会保持数据库连接,长时间不提交(commit)或回滚(rollback)可能导致连接泄露,建议及时处理事务。 -
查询性能 复杂查询建议使用
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.Model和db.Column定义表结构; - 通过
db.session执行增删改查; - 通过
commit()/rollback()管理事务; - 通过
create_all()/drop_all()管理表结构。
掌握这些操作后,即可完成绝大多数数据库交互需求。