SQLAlchemy 關(guān)于對(duì)象

我們?cè)趯慡QLAlchemy的時(shí)候, 通常定義好 數(shù)據(jù)庫(kù)表的類, 然后比如插入數(shù)據(jù), 就會(huì)先生成一個(gè)對(duì)象, 然后做插入操作, 或者是query得到一個(gè)對(duì)象, 即查詢結(jié)果.

在 session 中, 一個(gè)對(duì)象會(huì)有4個(gè)狀態(tài)

  1. Transient: 此時(shí)對(duì)象并不在session中, 而且沒(méi)有保存到數(shù)據(jù)庫(kù)中, 比如剛新建的對(duì)象.
  2. Pending: 在調(diào)用add()時(shí), 傳入一個(gè)Transient狀態(tài)的對(duì)象, 那個(gè)對(duì)象的狀態(tài)改為Pending.
  3. Persistent: 一個(gè)對(duì)象存在于session, 且和數(shù)據(jù)庫(kù)中的某一行對(duì)應(yīng).(比如query得到的結(jié)果)
  4. Detached: 對(duì)象和數(shù)據(jù)庫(kù)中的一條數(shù)據(jù)對(duì)應(yīng), 但不在任何session中. 在commit之后, 所有的對(duì)象狀態(tài)都變成Detached.

還有個(gè) deleted, 是version1.1新增的狀態(tài).

一個(gè)對(duì)象從進(jìn)入session 到 離開(kāi)session, 通常要經(jīng)過(guò)這4個(gè)過(guò)程.

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 會(huì)重點(diǎn)跟蹤Pending狀態(tài)的對(duì)象, 對(duì)于persistent的對(duì)象, 因?yàn)樗硎緦?duì)象和數(shù)據(jù)庫(kù)中的數(shù)據(jù)已經(jīng)一致, 那么這個(gè)對(duì)象隨時(shí)可以從 session 去丟棄. 那么問(wèn)題是 何時(shí)丟棄?
丟的太早, 用戶如果剛好要查詢剛剛插入的數(shù)據(jù), 那么又得從數(shù)據(jù)庫(kù)中讀取一次; 如果丟的太晚, 大量對(duì)象會(huì)囤積在內(nèi)存中. 于是這件事情就交給了 垃圾回收.
session 中的對(duì)象都有一個(gè)weakref(弱引用), 會(huì)被垃圾回收強(qiáng)制回收.
為了保證padding狀態(tài)的數(shù)據(jù)不被強(qiáng)制回收, 用強(qiáng)引用保存它們, 在session的new, dirty, deleted屬性中可以看到."new表示剛剛被加入會(huì)話的對(duì)象,dirty屬性表示剛剛被修改的對(duì)象,而deleted屬性表示在會(huì)話中被刪除的對(duì)象"

one = User("a","b")
db.session.add(one)
print(db.session.new)
# Out[27]: IdentitySet([User: a])
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這部分主要是開(kāi)源Java EE框架方面的內(nèi)容,包括Hibernate、MyBatis、Spring、Spring ...
    雜貨鋪老板閱讀 1,566評(píng)論 0 2
  • 一、hibernate持久化對(duì)象狀態(tài)(一級(jí)緩存)持久化對(duì)象 Persistent Object = POJO +...
    luweicheng24閱讀 268評(píng)論 0 0
  • web service 相關(guān) 什么是Web Service? 答:從表面上看,Web Service就是一個(gè)應(yīng)用程...
    niuben閱讀 1,091評(píng)論 0 3
  • 二十幾個(gè)春秋已過(guò)去,父親由年輕漸漸變老,而我由幼小逐漸長(zhǎng)大。歲月是把無(wú)情刻刀,改變了父母的容顏和體形,那令人鬧心的...
    落拓野客閱讀 256評(píng)論 0 1
  • 不知不覺(jué),已經(jīng)在北京待了四個(gè)多月了,還有不到10天就要回家了。想想在北京這四個(gè)多月以來(lái),自己都做了哪些有意義的事情...
    SunPengcheng閱讀 513評(píng)論 0 0

友情鏈接更多精彩內(nèi)容