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

在 FastAPI 中,db.adddb.commitdb.flushdb.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 按需插入中间。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值