如何使用SQLAlchemy ORM更新数据库中的已有数据?
SQLAlchemy里更新/同步数据库实体的方法
看你的代码,用的是SQLAlchemy的Session对象,不存在内置的foo()函数,但有几个现成方法能实现你想要的效果:
session.refresh():如果是要把实体和数据库的最新状态同步(比如确保拿到数据库自动生成的主键、其他事务改过后的数据),就用这个:
user = User() user.name = 'Jonh' session.add(user) session.commit() # 同步user和数据库的最新状态,保证拿到正确的id session.refresh(user) print(user.id) # 这时候就能拿到id了
这个方法会从数据库重新加载实体的所有属性,覆盖内存里的当前值。
session.merge():要是你修改了已经脱离session管理的实体(比如commit之后改了属性,或者从别的session拿到的实例),想把变更同步到数据库,就用merge:
user = User() user.name = 'Jonh' session.add(user) session.commit() # 修改已经脱离session的user user.name = 'John' # 把变更合并到当前session,之后要commit才生效 updated_user = session.merge(user) session.commit() print(updated_user.id)
merge会返回一个当前session管理的实体实例,commit之后变更就写入数据库了。
- 直接改属性再commit:如果是在同一个session里改实体属性,不用额外函数,直接改完commit就行:
user = User() user.name = 'Jonh' session.add(user) session.commit() # 直接改属性 user.name = 'John Doe' session.commit() print(user.id)
另外提一句:正常情况下,session.commit()之后,新增的实体应该已经有自动生成的主键id了,不需要额外调用方法。如果你的场景里commit后拿不到id,可能是主键生成策略的问题(比如用了客户端生成主键,或者延迟加载),这时候session.refresh()就能解决。
内容的提问来源于stack exchange,提问作者RandomInternetUser
相关产品推荐
相关产品推荐

