fastapi 中的db.add db.comit db.flush db.refresh都是什么含义 有顺序吗

作者:袖梨 2026-06-18

在 FastAPI 中,db.adddb.commitdb.flushdb.refresh 其实是 SQLAlchemy ORM(数据库工具) 中「会话(Session)」的方法(db 通常是 SQLAlchemy 会话的实例),用于操作数据库。它们的作用和顺序与数据库事务、对象状态管理密切相关,下面逐一解释:

fastapi 中的db.add db.comit db.flush db.refresh都是什么意思 有顺序吗

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等字段,先flushdb.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 按需插入中间。

相关文章

精彩推荐