国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SQLAlchemy 中的會(huì)話(Session)緩存詳解

這篇具有很好參考價(jià)值的文章主要介紹了SQLAlchemy 中的會(huì)話(Session)緩存詳解。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

SQLAlchemy 的會(huì)話緩存(Session Cache)是 ORM 框架的核心特性之一,對(duì)于理解和高效使用 SQLAlchemy 至關(guān)重要。這個(gè)緩存機(jī)制主要作用在會(huì)話(Session)層面,提供了對(duì)數(shù)據(jù)庫(kù)交互的中間緩存層。以下是對(duì) SQLAlchemy 會(huì)話緩存的詳細(xì)解釋?zhuān)?/p>

什么是會(huì)話緩存?

  1. 一級(jí)緩存:會(huì)話緩存也被稱(chēng)為一級(jí)緩存。它自動(dòng)存儲(chǔ)在一個(gè) SQLAlchemy Session 生命周期內(nèi)加載的所有 ORM 對(duì)象。這意味著在會(huì)話期間,對(duì)同一個(gè)數(shù)據(jù)庫(kù)實(shí)體的重復(fù)查詢不會(huì)導(dǎo)致多次數(shù)據(jù)庫(kù)請(qǐng)求。

  2. 自動(dòng)化的工作流:當(dāng)你通過(guò)一個(gè)會(huì)話查詢數(shù)據(jù)庫(kù)時(shí),SQLAlchemy 首先檢查這個(gè)對(duì)象是否已經(jīng)在會(huì)話緩存中。如果是,它會(huì)直接從緩存中返回對(duì)象,而不是從數(shù)據(jù)庫(kù)重新加載。

  3. 對(duì)象唯一性:在一個(gè)會(huì)話中,對(duì)于具有相同主鍵的實(shí)體,會(huì)話緩存確保只有一個(gè)唯一的對(duì)象實(shí)例。這有助于維護(hù)數(shù)據(jù)的一致性。

會(huì)話緩存的工作原理

當(dāng)您使用 Session 對(duì)象查詢數(shù)據(jù)庫(kù)時(shí),例如:

my_object = session.query(MyModel).filter_by(id=1).first()
  • 如果 my_object 是首次被請(qǐng)求,它會(huì)被加載并存儲(chǔ)在會(huì)話緩存中。

  • 如果稍后在同一會(huì)話中再次查詢相同的 MyModel 實(shí)例,SQLAlchemy 會(huì)直接從會(huì)話緩存中返回這個(gè)對(duì)象,而不是執(zhí)行新的數(shù)據(jù)庫(kù)查詢。

會(huì)話緩存的好處

  1. 減少數(shù)據(jù)庫(kù)查詢:通過(guò)減少對(duì)數(shù)據(jù)庫(kù)的重復(fù)查詢,提高了應(yīng)用性能。

  2. 數(shù)據(jù)一致性:在會(huì)話期間,對(duì)于同一對(duì)象的更改在整個(gè)會(huì)話中是一致的,避免了可能的數(shù)據(jù)不一致問(wèn)題。

  3. 事務(wù)支持:會(huì)話緩存支持事務(wù)操作。當(dāng)一個(gè)事務(wù)被回滾時(shí),所有的會(huì)話緩存也會(huì)被回滾到事務(wù)開(kāi)始之前的狀態(tài)。

管理會(huì)話緩存

  • 清空緩存:可以通過(guò) session.expire_all() 清空會(huì)話緩存,這會(huì)使所有已加載的對(duì)象變?yōu)椤斑^(guò)期”狀態(tài),下次訪問(wèn)這些對(duì)象的任何屬性時(shí),SQLAlchemy 會(huì)從數(shù)據(jù)庫(kù)重新加載它們。

  • 手動(dòng)刷新:session.flush() 會(huì)將會(huì)話中的更改(如新對(duì)象或修改的對(duì)象)同步到數(shù)據(jù)庫(kù),但不會(huì)提交事務(wù)。這不會(huì)影響會(huì)話緩存中已有的對(duì)象。

注意事項(xiàng)

  • 長(zhǎng)期會(huì)話問(wèn)題:在長(zhǎng)期運(yùn)行的會(huì)話中,會(huì)話緩存可能會(huì)導(dǎo)致內(nèi)存占用增加,特別是在處理大量數(shù)據(jù)時(shí)。

  • 數(shù)據(jù)過(guò)時(shí)問(wèn)題:如果數(shù)據(jù)庫(kù)中的數(shù)據(jù)在會(huì)話外被修改,會(huì)話緩存中的數(shù)據(jù)可能會(huì)過(guò)時(shí)。這種情況下,需要使用 expire、refresh 或 expire_all 方法來(lái)更新緩存數(shù)據(jù)。

代碼展示

print("=====================================會(huì)話緩存==================================================")

# 第一次查詢,并加載用戶的所有關(guān)聯(lián)部門(mén)項(xiàng)
sql1 = select(models.VadminUser).where(models.VadminUser.id == 1).options(joinedload(models.VadminUser.depts))
queryset1 = await self.db.scalars(sql1)
user1 = queryset1.unique().first()
print(f"用戶編號(hào):{user1.id} 用戶姓名:{user1.name} 關(guān)聯(lián)部門(mén) {[i.name for i in user1.depts]}")

# 第二次即使沒(méi)有加載用戶關(guān)聯(lián)的部門(mén),同樣可以訪問(wèn),因?yàn)檫@里會(huì)默認(rèn)從會(huì)話緩存中獲取
sql2 = select(models.VadminUser).where(models.VadminUser.id == 1)
queryset2 = await self.db.scalars(sql2)
user2 = queryset2.first()
print(f"用戶編號(hào):{user2.id} 用戶姓名:{user2.name} 關(guān)聯(lián)部門(mén) {[i.name for i in user2.depts]}")

# 使當(dāng)前會(huì)話(Session)中所有已加載的對(duì)象過(guò)期,確保您獲取的是數(shù)據(jù)庫(kù)中的最新數(shù)據(jù)。
self.db.expire_all()

print("===================查詢出來(lái),即使沒(méi)有通過(guò).訪問(wèn)屬性,同樣會(huì)產(chǎn)生緩存=====================")

# 第一次查詢,并加載用戶的所有關(guān)聯(lián)部門(mén)項(xiàng),但是不訪問(wèn)用戶的屬性
sql3 = select(models.VadminUser).where(models.VadminUser.id == 1).options(joinedload(models.VadminUser.depts))
queryset3 = await self.db.scalars(sql3)
user3 = queryset3.unique().first()
print(f"沒(méi)有訪問(wèn)屬性,也會(huì)產(chǎn)生緩存")

# 第二次即使沒(méi)有加載用戶關(guān)聯(lián)的部門(mén),同樣可以訪問(wèn),因?yàn)檫@里會(huì)默認(rèn)從會(huì)話緩存中獲取
sql4 = select(models.VadminUser).where(models.VadminUser.id == 1)
queryset4 = await self.db.scalars(sql4)
user4 = queryset4.first()
print(f"用戶編號(hào):{user4.id} 用戶姓名:{user4.name} 關(guān)聯(lián)部門(mén) {[i.name for i in user4.depts]}")

# 使當(dāng)前會(huì)話(Session)中所有已加載的對(duì)象過(guò)期,確保您獲取的是數(shù)據(jù)庫(kù)中的最新數(shù)據(jù)。
self.db.expire_all()

print("=====================================數(shù)據(jù)列表會(huì)話緩存==================================================")

# 第一次查詢出所有用戶,并加載用戶的所有關(guān)聯(lián)部門(mén)項(xiàng)
sql5 = select(models.VadminUser).options(joinedload(models.VadminUser.depts))
queryset5 = await self.db.scalars(sql5)
datas5 = queryset5.unique().all()
for data in datas5:
    print(f"用戶編號(hào):{data.id} 用戶姓名:{data.name} 關(guān)聯(lián)部門(mén) {[i.name for i in data.depts]}")

# 第二次即使沒(méi)有加載用戶關(guān)聯(lián)的部門(mén),同樣可以訪問(wèn),因?yàn)檫@里會(huì)默認(rèn)從會(huì)話緩存中獲取
sql6 = select(models.VadminUser)
queryset6 = await self.db.scalars(sql6)
datas6 = queryset6.unique().all()
for data in datas6:
    print(f"用戶編號(hào):{data.id} 用戶姓名:{data.name} 關(guān)聯(lián)部門(mén) {[i.name for i in data.depts]}")

# 使當(dāng)前會(huì)話(Session)中所有已加載的對(duì)象過(guò)期,確保您獲取的是數(shù)據(jù)庫(kù)中的最新數(shù)據(jù)。
self.db.expire_all()

print("===================expire 單個(gè)對(duì)象過(guò)期=====================")

# 第一次查詢,并加載用戶的所有關(guān)聯(lián)部門(mén)項(xiàng)
sql7 = select(models.VadminUser).where(models.VadminUser.id == 1).options(joinedload(models.VadminUser.depts))
queryset7 = await self.db.scalars(sql7)
user7 = queryset7.unique().first()
print(f"用戶編號(hào):{user7.id} 用戶姓名:{user7.name} 關(guān)聯(lián)部門(mén) {[i.name for i in user7.depts]}")

# 使當(dāng)前會(huì)話(Session)中的 user7 對(duì)象過(guò)期,再次訪問(wèn)就會(huì)重新查詢數(shù)據(jù)庫(kù)數(shù)據(jù)
self.db.expire(user7)

# 第二次查詢會(huì)發(fā)現(xiàn)會(huì)話中沒(méi)有該對(duì)象的緩存,會(huì)重新在數(shù)據(jù)庫(kù)中查詢
sql8 = select(models.VadminUser).where(models.VadminUser.id == 1)
queryset8 = await self.db.scalars(sql8)
user8 = queryset8.first()
try:
    print(f"用戶編號(hào):{user8.id} 用戶姓名:{user8.name} 關(guān)聯(lián)部門(mén) {[i.name for i in user8.depts]}")
except StatementError:
    print("訪問(wèn)部門(mén)報(bào)錯(cuò)了?。。。?!")

# 使當(dāng)前會(huì)話(Session)中所有已加載的對(duì)象過(guò)期,確保您獲取的是數(shù)據(jù)庫(kù)中的最新數(shù)據(jù)。
self.db.expire_all()

print("=========expire 單個(gè)對(duì)象過(guò)期后,重新訪問(wèn)之前對(duì)象的屬性也會(huì)重新查詢數(shù)據(jù)庫(kù),但是不會(huì)重新加載關(guān)系===========")

# 第一次查詢,并加載用戶的所有關(guān)聯(lián)部門(mén)項(xiàng)
sql9 = select(models.VadminUser).where(models.VadminUser.id == 1).options(joinedload(models.VadminUser.depts))
queryset9 = await self.db.scalars(sql9)
user9 = queryset9.unique().first()
print(f"用戶編號(hào):{user9.id} 用戶姓名:{user9.name} 關(guān)聯(lián)部門(mén) {[i.name for i in user9.depts]}")

# 使當(dāng)前會(huì)話(Session)中的 user9 對(duì)象過(guò)期,再次訪問(wèn)就會(huì)重新查詢數(shù)據(jù)庫(kù)數(shù)據(jù)
self.db.expire(user9)

# 第二次查詢會(huì)發(fā)現(xiàn)會(huì)話中沒(méi)有該對(duì)象的緩存,會(huì)重新在數(shù)據(jù)庫(kù)中查詢,但是不會(huì)重新加載關(guān)系
try:
    print(f"用戶編號(hào):{user9.id} 用戶姓名:{user9.name} 關(guān)聯(lián)部門(mén) {[i.name for i in user9.depts]}")
except StatementError:
    print("訪問(wèn)部門(mén)報(bào)錯(cuò)了?。。。。?)

print("=====================================結(jié)束==================================================")

總結(jié)

會(huì)話緩存是 SQLAlchemy 中一個(gè)強(qiáng)大的特性,它提高了應(yīng)用性能并支持復(fù)雜的事務(wù)管理。然而,合理地管理會(huì)話和緩存是確保應(yīng)用穩(wěn)定性和數(shù)據(jù)一致性的關(guān)鍵。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-786450.html

到了這里,關(guān)于SQLAlchemy 中的會(huì)話(Session)緩存詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 從Cookie到Session: Servlet API中的會(huì)話管理詳解

    從Cookie到Session: Servlet API中的會(huì)話管理詳解

    首先, 在學(xué)習(xí)過(guò) HTTP 協(xié)議的基礎(chǔ)上, 我們需要知道 Cookie 是 HTTP 請(qǐng)求報(bào)頭中的一個(gè)段, 本質(zhì)上是瀏覽器在本地存儲(chǔ)數(shù)據(jù)的一種機(jī)制, 要清楚 Cookie 是從哪里來(lái), 要到哪里去. Cookie 是來(lái)自于服務(wù)器的, 通過(guò)響應(yīng)報(bào)文中的 Set-Cookie 字段將數(shù)據(jù)返回保存在瀏覽器本地的; 后續(xù)當(dāng)瀏覽

    2024年02月08日
    瀏覽(22)
  • SQLAlchemy詳解

    SQLAlchemy詳解

    SQLAlchemy 是 Python SQL 工具包和對(duì)象關(guān)系映射器,為應(yīng)用程序開(kāi)發(fā)人員提供 SQL 的全部功能和靈活性。 SQLAlchemy支持SQLite、PostgreSQL、Oracle、MySQL、MariaDB、Microsoft SQL Server等多種數(shù)據(jù)庫(kù)。 我安裝的版本是:SQLAlchemy==2.0.29。注意SQLAlchemy2.x以上的版本和1.x版本差別還是挺大的,注意版

    2024年04月08日
    瀏覽(9)
  • 軟件測(cè)試|sqlalchemy一對(duì)一關(guān)系詳解

    軟件測(cè)試|sqlalchemy一對(duì)一關(guān)系詳解

    簡(jiǎn)介 SQLAlchemy 是一個(gè)強(qiáng)大的 Python ORM(對(duì)象關(guān)系映射)庫(kù),它允許我們將數(shù)據(jù)庫(kù)表映射到 Python 對(duì)象,并提供了豐富的關(guān)系模型來(lái)處理不同類(lèi)型的關(guān)系,包括一對(duì)一關(guān)系。在本文中,我們將深入探討 SQLAlchemy 中表一對(duì)一關(guān)系的概念,以及如何在模型中定義和使用這種關(guān)系。 什

    2024年01月17日
    瀏覽(22)
  • flask中的操作數(shù)據(jù)庫(kù)的插件Flask-SQLAlchemy

    flask中的操作數(shù)據(jù)庫(kù)的插件Flask-SQLAlchemy

    Web 開(kāi)發(fā)中,一個(gè)重要的組成部分便是數(shù)據(jù)庫(kù)了。Web 程序中最常用的莫過(guò)于關(guān)系型數(shù)據(jù)庫(kù)了,也稱(chēng) SQL 數(shù)據(jù)庫(kù)。另外,文檔數(shù)據(jù)庫(kù)(如 mongodb)、鍵值對(duì)數(shù)據(jù)庫(kù)(如 redis)近幾年也逐漸在 web 開(kāi)發(fā)中流行起來(lái),我們習(xí)慣把這兩種數(shù)據(jù)庫(kù)稱(chēng)為 NoSQL 數(shù)據(jù)庫(kù)。 大多數(shù)的關(guān)系型數(shù)據(jù)庫(kù)引

    2024年02月09日
    瀏覽(33)
  • SqlAlchemy使用教程(三) CoreAPI訪問(wèn)與操作數(shù)據(jù)庫(kù)詳解

    SqlAlchemy使用教程(三) CoreAPI訪問(wèn)與操作數(shù)據(jù)庫(kù)詳解

    SqlAlchemy使用教程(一) 原理與環(huán)境搭建 SqlAlchemy使用教程(二) 入門(mén)示例及編程步驟 SqlAlchemy使用教程(三) CoreAPI訪問(wèn)與操作數(shù)據(jù)庫(kù)詳解 SqlAlchemy使用教程(四) MetaData 與 SQL Express Language 的使用 SqlAlchemy使用教程(五) ORM API 編程入門(mén) Sqlalchemy 的Core部分集成了DB API, 事務(wù)管理,schema描述等

    2024年02月02日
    瀏覽(19)
  • Python SQL 數(shù)據(jù)庫(kù)操作利器:SQLAlchemy 庫(kù)詳解(看這一篇文章就夠了)

    引言: Python 是一門(mén)廣受歡迎的編程語(yǔ)言,而 SQL 則是用于管理和操作數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)查詢語(yǔ)言。SQLAlchemy 是一個(gè)功能強(qiáng)大的 Python 庫(kù),它提供了一種與多種數(shù)據(jù)庫(kù)進(jìn)行交互的靈活方式。本文將介紹 SQLAlchemy 庫(kù),并以九個(gè)重要的要點(diǎn)詳細(xì)解釋其功能和用法。 SQLAlchemy 簡(jiǎn)介 SQLAlchem

    2024年02月07日
    瀏覽(15)
  • Servlet【 ServletAPI中的會(huì)話管理Cookie與Session】

    Servlet【 ServletAPI中的會(huì)話管理Cookie與Session】

    HTTP 協(xié)議自身是屬于 “無(wú)狀態(tài)” 協(xié)議. “無(wú)狀態(tài)” 的含義指的是: 默認(rèn)情況下 HTTP 協(xié)議的客戶端和服務(wù)器之間的這次通信, 和下次通信之間沒(méi)有直接的聯(lián)系.但是實(shí)際開(kāi)發(fā)中, 我們很多時(shí)候是需要知道請(qǐng)求之間的關(guān)聯(lián)關(guān)系的. 例如登陸網(wǎng)站成功后, 第二次訪問(wèn)的時(shí)候服務(wù)器就能知

    2024年02月09日
    瀏覽(60)
  • 【Flask】from flask_sqlalchemy import SQLAlchemy報(bào)錯(cuò)

    【Flask】from flask_sqlalchemy import SQLAlchemy報(bào)錯(cuò)

    在使用 flask_sqlalchemy 之前,你需要確保已經(jīng)通過(guò) pip 安裝了 Flask-SQLAlchemy??梢酝ㄟ^(guò)以下命令安裝它: ? ?pip install Flask-SQLAlchemy Python 是區(qū)分大小寫(xiě)的,確保在導(dǎo)入和使用模塊時(shí)大小寫(xiě)與實(shí)際安裝的庫(kù)名稱(chēng)一致。確保你在代碼中使用的是 SQLAlchemy,而不是 SQLAlchem。 正確的導(dǎo)入

    2024年02月09日
    瀏覽(15)
  • 【Flask】SQLAlchemy

    為什么使用orm 優(yōu)點(diǎn) 有語(yǔ)法提示, 省去自己拼寫(xiě)SQL,保證SQL語(yǔ)法的正確性 orm提供方言功能(dialect, 可以轉(zhuǎn)換為多種數(shù)據(jù)庫(kù)的語(yǔ)法), 減少學(xué)習(xí)成本 防止sql注入攻擊 搭配數(shù)據(jù)遷移, 更新數(shù)據(jù)庫(kù)方便 面向?qū)ο? 可讀性強(qiáng), 開(kāi)發(fā)效率高 缺點(diǎn) 需要語(yǔ)法轉(zhuǎn)換, 效率比原生sql低 復(fù)雜的查詢往

    2024年02月13日
    瀏覽(19)
  • sqlalchemy執(zhí)行原生sql

    # 有的復(fù)雜sql 用orm寫(xiě)不出來(lái)---》用原生sql查詢 # 原生sql查詢,查出的結(jié)果是對(duì)象 # 原生sql查詢,查詢結(jié)果列表套元組 ?準(zhǔn)備工作 執(zhí)行原生sql方式一: 執(zhí)行原生sql方式二: (以后都用session操作---》socpe_session線程安全)一般不用 執(zhí)行原生sql方式三:

    2024年02月13日
    瀏覽(7)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包