SQLAlchemy 关于对象

我们在写SQLAlchemy的时候, 通常定义好 数据库表的类, 然后比如插入数据, 就会先生成一个对象, 然后做插入操作, 或者是query得到一个对象, 即查询结果.

在 session 中, 一个对象会有4个状态

  1. Transient: 此时对象并不在session中, 而且没有保存到数据库中, 比如刚新建的对象.
  2. Pending: 在调用add()时, 传入一个Transient状态的对象, 那个对象的状态改为Pending.
  3. Persistent: 一个对象存在于session, 且和数据库中的某一行对应.(比如query得到的结果)
  4. Detached: 对象和数据库中的一条数据对应, 但不在任何session中. 在commit之后, 所有的对象状态都变成Detached.

还有个 deleted, 是version1.1新增的状态.

一个对象从进入session 到 离开session, 通常要经过这4个过程.

from sqlalchemy import inspect
one = User("a", "b")
insp = inspect(one)
insp.transient
# Out[10]: True
insp.pending
# Out[11]: False
db.session.add(one)
insp.pending
# Out[13]: True
insp.transient
# Out[14]: False
db.session.commit()
insp.persistent
# Out[19]: True

session 会重点跟踪Pending状态的对象, 对于persistent的对象, 因为它表示对象和数据库中的数据已经一致, 那么这个对象随时可以从 session 去丢弃. 那么问题是 何时丢弃?
丢的太早, 用户如果刚好要查询刚刚插入的数据, 那么又得从数据库中读取一次; 如果丢的太晚, 大量对象会囤积在内存中. 于是这件事情就交给了 垃圾回收.
session 中的对象都有一个weakref(弱引用), 会被垃圾回收强制回收.
为了保证padding状态的数据不被强制回收, 用强引用保存它们, 在session的new, dirty, deleted属性中可以看到."new表示刚刚被加入会话的对象,dirty属性表示刚刚被修改的对象,而deleted属性表示在会话中被删除的对象"

one = User("a","b")
db.session.add(one)
print(db.session.new)
# Out[27]: IdentitySet([User: a])
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这部分主要是开源Java EE框架方面的内容,包括Hibernate、MyBatis、Spring、Spring ...
    杂货铺老板阅读 1,449评论 0 2
  • 一、hibernate持久化对象状态(一级缓存)持久化对象 Persistent Object = POJO +...
    luweicheng24阅读 220评论 0 0
  • web service 相关 什么是Web Service? 答:从表面上看,Web Service就是一个应用程...
    niuben阅读 979评论 0 3
  • 二十几个春秋已过去,父亲由年轻渐渐变老,而我由幼小逐渐长大。岁月是把无情刻刀,改变了父母的容颜和体形,那令人闹心的...
    落拓野客阅读 219评论 0 1
  • 不知不觉,已经在北京待了四个多月了,还有不到10天就要回家了。想想在北京这四个多月以来,自己都做了哪些有意义的事情...
    SunPengcheng阅读 478评论 0 0