SQLAlchemy中flush和commit的区别

本文探讨了SQLAlchemy中flush和commit的区别。flush主要更新数据库的事务缓存,不直接执行事务,而commit则是提交事务操作,涉及实际的磁盘I/O。flush会生成主键,即使未commit,下次插入时主键仍会递增。在需要获取自增主键时,可先flush再query。session在查询前会自动flush,因此新创建的对象能在同一session内查询到,但只有commit后,其他session才能看到变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Flush和Commit的区别

  1. Commit操作比较好理解,就是提交一次事务Transaction操作。既然是提交一次事务操作,就包含了增删改的SQL操作。所以必然是Session通过Connection进行写磁盘I/O的操作。
  2. Flush不同的是,它并没有真正的执行事务Transaction的操作,而是更新了数据库的事务缓存[1]。所以Flush是会和数据库进行通信的。Flush操作告知数据库把事务操作缓存在数据库,直到数据库收到了Commit操作之后才会真正将操作更新到磁盘中[5]。

You may flush() as often as you like within a transaction to move changes from Python to the database’s transaction buffer.

  1. Flush方法会生成Primary Key,所以哪怕Flush之后并不进行Commit操作,Primary Key也还是会生成。所以下一次Insert一条记录时,Primary Key会再次加1.
  2. 通常如果我们希望在Commit之前获取到待插入数据的自增主键,那我们可以在Commit之前进行Flush操作。这时SQLAlchemy的对象就会获取到数据库生成待对应数据行的主键值[4]。
  3. Session在进行查询时(查询操作之前)会进行一次Flush操作。所以创建了对象,虽然并没有提交,但是紧接着进行Query操作也能在当前Session中查询到这个对象[2]。
  4. Flush之后就能在当前Session中看到效果,而Commit之后才能在其他Session中看到效果[3]。

### 使用SQLAlchemy进行数据插入操作 为了通过SQLAlchemy执行数据插入操作,可以采用两种主要方法:一种是利用ORM(对象关系映射),另一种则是直接使用`execute()`函数来运行原始SQL语句。这里重点介绍基于ORM的方法。 #### 创建模型类 在开始之前,需定义一个继承自`Base`的Python类作为表结构模板[^1]: ```python from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String(50)) fullname = Column(String(50)) nickname = Column(String(50)) def __repr__(self): return "<User(name='%s', fullname='%s', nickname='%s')>" % ( self.name, self.fullname, self.nickname) ``` 此段代码定义了一个名为`User`的数据模型,对应着数据库中的`users`表格,并指定了几个字段及其属性类型。 #### 初始化会话并建立连接 接着,在应用程序启动时初始化Session工厂以及创建实际使用的session实例[^2]: ```python from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine engine = create_engine('postgresql://username:password@localhost/mydatabase') Session = sessionmaker(bind=engine) # Create a new Session object. session = Session() ``` 上述代码片段展示了如何设置PostgreSQL数据库连接字符串,并绑定了该引擎到新的Session制造器上;随后每次调用`Session()`都会返回一个新的独立事务性的会话对象。 #### 插入单条记录 当准备向数据库中添加新纪录时,可以通过如下方式实现[^3]: ```python ed_user = User(name='ed', fullname='Ed Jones', nickname='edsnickname') # Add the record to the current transactional state of our session. session.add(ed_user) # Commit all changes and flush them into the database. session.commit() ``` 这段脚本首先构建了一位用户的实例化对象,之后将其加入当前活跃的会话之中等待提交至持久层存储起来。最后一步至关重要——它不仅保存了所有的更改还触发了与之关联的操作同步到了目标DBMS里边去。 #### 批量插入多条记录 如果要一次性插入多个实体,则可采取批量处理模式以提高效率[^4]: ```python new_users = [ User(name='wendy', fullname='Wendy Williams', nickname='windy'), User(name='mary', fullname='Mary Contrary', nickname='mary'), User(name='fred', fullname='Fred Flintstone', nickname='freddy') ] # Extend the existing set with multiple items at once. session.bulk_save_objects(new_users) # Remember to commit after bulk operations too! session.commit() ``` 在此处,列表形式传递给`bulk_save_objects()`方法允许一次写入若干个用户信息进入指定的目标集合内。同样地,完成这些动作后记得再次确认提交以便最终生效。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值