fastapi 中的db.add db.comit db.flush db.refresh都是什么意思 有顺序吗
在 FastAPI 中,db.add、db.commit、db.flush、db.refresh 其实是 SQLAlchemy ORM(数据库工具) 中「会话(Session)」的方法(db 通常是 SQLAlchemy 会话的实例),用于操作数据库。它们的作用和顺序与数据库事务、对象状态管理密切相关,下面逐一解释:
1. db.add(obj)
作用:将一个「数据库模型对象」添加到当前会话(Session)中,标记为「待提交」状态。
- 此时对象只是被「暂存」在会话中,并未真正写入数据库。
- 适用于「新增数据」:比如创建一个
User实例,通过db.add(user)告诉会话 “这个对象需要被保存到数据库”。
2. db.flush()
作用:将当前会话中所有「待提交的更改」(包括新增、修改、删除)发送到数据库执行,但不提交事务。
- 执行后,数据库会真正执行 SQL 语句(比如
INSERT/UPDATE),生成自增 ID、默认值等(如果有),但这些更改还处于「事务未确认」状态(可以被回滚)。 - 用途:如果需要在提交事务前获取数据库生成的字段(比如自增 ID),可以先
flush,此时内存中的对象会同步数据库生成的值。
3. db.commit()
作用:提交当前事务,将 flush 到数据库的所有更改「永久保存」到数据库,事务结束。
- 只有
commit后,新增的数据才会被真正写入数据库,其他事务才能看到这些更改。 - 如果不
commit,会话关闭后,所有add或flush的更改会被自动回滚(丢失)。
4. db.refresh(obj)
作用:从数据库中重新加载对象的最新数据,同步到内存中的对象实例。
- 比如:新增对象被
commit后,数据库可能自动生成了create_time字段,通过db.refresh(obj)可以将这个字段的值同步到内存中的obj里。 - 或者:当对象在数据库中被其他操作修改后,用
refresh可以获取最新状态。
执行顺序(以「新增数据」为例)
通常的流程是:
python
运行
# 1. 创建模型对象
user = User(name="张三", age=20)# 2. 将对象添加到会话(标记为待提交)
db.add(user)# 3. (可选)如果需要提前获取数据库生成的ID等字段,先flush
db.flush() # 此时数据库执行INSERT,user.id会被赋值(如果是自增ID)# 4. 提交事务,永久保存到数据库
db.commit()# 5. (可选)同步数据库自动生成的字段(如create_time)到内存对象
db.refresh(user)
关键区别总结
| 方法 | 核心作用 | 是否写入数据库 | 是否提交事务 |
|---|---|---|---|
db.add | 标记对象为待提交 | 否 | 否 |
db.flush | 执行 SQL 但不提交事务,同步临时结果 | 是(临时) | 否 |
db.commit | 提交事务,永久保存所有更改 | 是(永久) | 是 |
db.refresh | 从数据库同步最新数据到内存对象 | 否(只读) | 否 |
简单说:add 是 “告诉会话要保存什么”,flush 是 “先让数据库临时执行一下”,commit 是 “确认保存,生效”,refresh 是 “更新内存对象为数据库最新状态”。顺序上,add 通常在最前,commit 是最终确认,flush 和 refresh 按需插入中间。
