SQLAlchemy 2.x 異步查詢方法比較

SQLAlchemy 2.x 異步查詢中常用的 結果處理方法速查表,包含方法說明、使用場景、返回類型及典型用途。

SQLAlchemy 查詢結果處理方法速查表(適用于 AsyncSession)

方法

說明

返回類型

示例 SQL

示例輸出

scalars().all()

獲取單列所有值

List[Any]

select(User.id)

[1, 2, 3, 4]

scalars().first()

獲取單列的第一行

Any

select(User.email)

"alice@example.com"

scalar()

獲取第一行的第一列(聚合)

Any

select(func.count(User.id))

27

mappings().all()

多列,每行為 dict 映射

List[dict]

select(User.id, User.email)

[{'id': 1, 'email': 'a@xx.com'}, {'id': 2, 'email': 'b@xx.com'}]

mappings().first()

返回第一行 dict 映射

dict

select(User.id, User.name)

{'id': 1, 'name': 'Alice'}

first()

返回第一行的 Row

`Row

None`

select(User.id, User.name)

fetchall()

返回所有行 Row 對象列表

List[Row]

select(User.id, User.name)

[(1, 'Alice'), (2, 'Bob')]

fetchone()

返回一行 Row

Row

select(User.id, User.name)

(1, 'Alice')

all()

返回所有 Row(非字典)

List[Row]

select(User.id, User.name)

[(1, 'Alice'), (2, 'Bob')]

one()

獲取唯一一行,若多行/無行報錯

Row

select(User).where(User.id==1)

User(id=1, name='Alice')

one_or_none()

獲取一行或 None

`Row

None`

select(User).where(User.id==9999)

使用建議(按類型):

  • 獲取單列(如用戶 ID) → 用 scalars().all()
  • 統計總數/最大值 → 用 scalar()
  • 獲取結構化多列數據(用于 JSON 返回) → 用 mappings().all()
  • 查找某條記錄詳情 → 用 mappings().first()one_or_none()
  • 返回原始 SQL 風格 Row → 用 fetchall() / all()(不推薦)

詳細解釋與建議:

  • scalars()
    • 專門用于查詢 單列,如 select(User.id)
    • 會自動去除 Row 封裝,只返回具體值
  • mappings()
    • 用于查詢 多列,將每一行封裝為 dict(字段名:值)
    • 最常用在結構化響應返回中(如 JSON)
  • first()one()
    • first():最多一行,超過無所謂,返回第一行
    • one():必須返回一行,返回多行或無行都拋異常
  • fetchall() / fetchone()
    • 老式用法,返回 Row 對象(類似元組)
    • 不推薦在現代異步代碼中使用,建議用 scalars() / mappings() 替代

推薦使用方式總結:

查詢類型

推薦方式

單列、多行

scalars().all()

單列、單值

scalar()scalars().first()

多列、多行

mappings().all()

多列、單行

mappings().first()one_or_none()

真實使用示例(異步 FastAPI):

async def test_get_single_column():async with session_factory() as session:query = select(User.id)result = await session.execute(query)user_ids = result.scalars().all()print("用戶 ID 列表:", user_ids)  # 用戶 ID 列表: [1, 3]# 2. 統計總數/最大值 → 用 scalar()
async def test_aggregate_functions():async with session_factory() as session:# 統計用戶總數total_count = await session.execute(select(func.count(User.id)))total = total_count.scalar()print("用戶總數:", total)  # 用戶總數: 2# 查找最大的角色 IDmax_role_id = await session.execute(select(func.max(User.role_id)))max_role_id_value = max_role_id.scalar()print("最大的角色 ID:", max_role_id_value)  # 最大的角色 ID: 2# 3. 獲取結構化多列數據(用于 JSON 返回) → 用 mappings().all()
async def test_get_structured_data():async with session_factory() as session:query = select(User.id, User.user_name, User.email)result = await session.execute(query)users = result.mappings().all()print("結構化多列數據:", users)# 結構化多列數據: [{'id': 1, 'user_name': 'test', 'email': '123@qq.com'},# {'id': 3, 'user_name': 'test1', 'email': '456@qq.com'}]# 4. 查找某條記錄詳情 → 用 mappings().first() 或 one_or_none()
async def test_find_single_record():async with session_factory() as session:# 使用 mappings().first()query = select(User.id, User.user_name, User.email).where(User.id == 1)result = await session.execute(query)user = result.mappings().first()print("使用 mappings().first() 查找的記錄:", user)# 使用 mappings().first() 查找的記錄: {'id': 1, 'user_name': 'test', 'email': '123@qq.com'}# 使用 one_or_none()user_obj = await session.execute(select(User).where(User.id == 1))user_result = user_obj.scalars().one_or_none()print("使用 one_or_none() 查找的記錄:", user_result)# 使用 one_or_none() 查找的記錄: <login_related.model.user.User object at 0x000001477DC206D0># 5. 返回原始 SQL 風格 Row → 用 fetchall() / all()(不推薦)
async def test_get_raw_rows():async with session_factory() as session:query = select(User.id, User.user_name, User.email)result = await session.execute(query)rows = result.all()print("原始 SQL 風格 Row:", rows)# 原始 SQL 風格 Row: [(1, 'test', '123@qq.com'), (3, 'test1', '456@qq.com')]

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903465.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903465.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903465.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

極客天成參與”AI助力智慧城市構建”主題演講暨招商引智專題推介活動

4月7日下午&#xff0c;北京極客天成科技有限公司參加了天津市河東區數據局舉辦的“AI賦能智慧城市構建”主題演講暨招商引智專題推介活動。 活動中&#xff0c;華為&#xff08;天津&#xff09;有限公司數字政府解決方案總監姜華庚圍繞“政務大模型賦能智慧城市建設”&#x…

理解 EKS CloudWatch Pod CPU Utilization 指標:與 `kubectl top` 及節點 CPU 的關系

在使用 AWS EKS 時&#xff0c;CloudWatch Container Insights 提供了豐富的容器級別監控指標&#xff0c;幫助我們深入了解應用的運行狀態。如下截圖中的 ContainerInsights pod_cpu_utilization 指標就是一個非常重要的維度。本文將詳細解釋這個指標的含義&#xff0c;并將其…

使用pip3安裝軟件包報錯`externally-managed-environment`的幾種解決方式

1、pip3安裝軟件包報錯 報錯externally-managed-environment的原因&#xff1a; 從 Python 3.11 開始引入了 PEP 668 規范&#xff0c;該規范限制了在系統級 Python 環境中使用 pip 安裝第三方包&#xff0c;以避免與系統包管理器&#xff08;如 apt&#xff09;產生沖突。 如…

spring security用戶退出

Spring security默認實現了用戶退出的功能&#xff0c;用戶退出主要考慮退出后會話如何管理以及跳轉到哪個頁面。HttpSecurity類提供了logout()方法開啟退出登錄的支持&#xff0c;默認觸發用戶退出操作的URL為“/logout”&#xff0c;用戶退出時同時也會清除Session等默認用戶…

愛普生SG2520HHN晶振數據中心服務器的理想解決方案

在當今數字化時代&#xff0c;數據中心作為海量數據存儲、處理與傳輸的核心樞紐&#xff0c;其服務器的高效穩定運行至關重要。服務器作為其核心設備&#xff0c;對時鐘信號的精度和穩定性提出了嚴苛要求——微小的時序誤差可能導致數據傳輸失敗或系統宕機。愛普生 SG2520HHN 差…

LeetCode 155題解 | 最小棧

最小棧 一、題目鏈接二、題目三、算法原理思路1&#xff1a;用一個變量存儲最小元素思路2&#xff1a;雙棧普通棧和最小棧 四、編寫代碼五、時間復雜度 一、題目鏈接 最小棧 二、題目 三、算法原理 棧用數組、鏈表實現都行&#xff0c;最主要的就是在能在常數時間內檢索到最…

es+kibana---集群部署

其實一般es要跑3個節點的&#xff0c;這樣才能做高可用&#xff0c;處理并發大&#xff0c;但是我這里只是一個pod mkdir -p /stroe/data/es es搭建&#xff1a; #【拉取鏡像】 #docker pull elasticsearch:6.8.7 #docker pull busybox:1.28 【導入鏡像】 docker load -i es.…

WPF常用技巧匯總 - Part 2

WPF常用技巧匯總-CSDN博客 主要用于記錄工作中發現的一些問題和常見的解決方法。 目錄 WPF常用技巧匯總-CSDN博客 1. DataGrid Tooltip - Multiple 2. DataGrid Tooltip - Cell值和ToolTip值一樣 3. DataGrid Tooltip - Cell值和ToolTip值不一樣 4. DataGrid - Ctrl A /…

uniapp打包apk如何實現版本更新

我們做的比較簡單&#xff0c;在后端設置版本號&#xff0c;并在uniapp的config.js中定義版本號&#xff0c;每次跟后端的進行對比&#xff0c;不一致的話就更新。 一、下載apk 主要代碼&#xff08;下載安裝包&#xff0c;并進行安裝&#xff0c;一般得手動同意安裝&#xf…

局部和整體的關系

Prompt&#xff1a;為什么要研究局部和整體的關系呢&#xff1f;是因為很多情況下&#xff0c;局部就能表達出整體&#xff1f; 這是一個非常本質的問題&#xff0c;其實你已經接近數學和物理中“幾何本質”的核心了。我們研究局部和整體的關系&#xff0c;是因為&#xff1a;…

企業辦公協同平臺安全一體化生態入住技術架構與接口標準分析報告

全球組織數字化與智能化背景下 企業辦公協同平臺安全一體化生態入住技術架構與接口標準分析報告 一、背景與市場需求 市場規模與增量 根據Statista數據&#xff0c;全球協同辦公平臺市場規模預計從2023年的$480億增長至2027年的$900億&#xff0c;年復合增長率&#xff08;CAG…

【2025最新面試八股常問知識點】HTTP1.0,HTTP1.1,HTTP2.0,HTTP3.0,HTTP的進化之路。

HTTP 超文本傳輸協議&#xff08;英文&#xff1a;HyperText Transfer Protocol&#xff0c;縮寫&#xff1a;HTTP&#xff09;是一種用于分布式、協作式和超媒體信息系統的應用層協議。設計HTTP最初的目的是為了提供一種發布和接收HTML頁面的方法。通過HTTP或者HTTPS協議請求的…

【算法練習】歸并排序和歸并分治

文章目錄 1.歸并排序1.1 遞歸版本1.2 非遞歸版本 2.歸并分治2.1 計算數組的小和2.2 計算翻轉對 1.歸并排序 歸并排序的核心步驟是&#xff1a; 拆分&#xff1a;將無序數組不斷對半拆分成小塊&#xff0c;直到每個小塊只剩一個元素&#xff08;自然有序&#xff09;。 合并&a…

域對齊是什么

域對齊&#xff08;Domain Alignment&#xff09;是在機器學習和計算機視覺等領域中常用的技術 定義 域對齊旨在將不同域&#xff08;Domain&#xff09;的數據映射到一個共同的特征空間中&#xff0c;使得來自不同域的數據在該空間中具有相似的分布。這里的“域”可以指代不…

【linux】git安裝、升級

git安裝、升級 一、快捷安裝版本2.18.0二、自定義版本安裝&#xff08;安裝、升級&#xff09;1、移除舊文件2、安裝所需依賴3、選擇指定版本4、解壓文件、編譯5、增加環境變量&#xff0c;驗證是否版本 三、升級 一、快捷安裝版本2.18.0 yum install git git --version二、自…

編程日志4.24

棧的鏈表基礎表示結構 #include<iostream> #include<stdexcept> using namespace std; //模板聲明&#xff0c;表明Stack類是一個通用的模板&#xff0c;可以用于存儲任何類型的元素T template<typename T> //棧的聲明 //Stack類的聲明&#xff0c;表示一…

《冰雪傳奇點卡版》:探索冰雪世界的傳奇旅程!

《冰雪傳奇點卡版》以“純凈打金”為核心&#xff0c;摒棄復雜付費坑&#xff0c;回歸經典傳奇玩法。以下從核心玩法、資源獲取、職業搭配、交易變現四維度展開&#xff0c;助你高效開啟冰雪傳奇之旅。 一、核玩法解析&#xff1a;如何高效獲取資源&#xff1f; 1. 職業定位與…

DeepClaude開源程序可以實現代碼生成、創作詩句以及內容創作等功能

一、軟件介紹 文末提供程序和源碼下載 DeepClaude開源程序是增強的 AI&#xff0c;可以實現代碼生成&#xff1a;DeepSeek r1 Claude 3.7 十四行詩 - 無與倫比的性能&#xff01;內容創作&#xff1a;DeepSeek r1 Gemini 2.5 Pro - 卓越的質量&#xff01;OpenAI 兼容。流媒…

Java常用注解通俗解釋

注解就像是給Java代碼貼的"便利貼"&#xff0c;它們不會改變代碼本身的邏輯&#xff0c;但能給編譯器、開發工具或運行時環境提供額外信息。下面我用最通俗的方式解釋Java中最常用的注解&#xff1a; 一、基礎篇&#xff1a;人人必知的注解 1. Override - "我…

vscode chrome調試怎么在所有瀏覽器都好使

chrome調試時只能在打開的瀏覽器里進行調試&#xff0c;其它打開的chrome瀏覽器就不能調試了&#xff0c;怎么解決。 右鍵點擊 Chrome 的快捷方式圖標&#xff0c;選擇屬性 在目標一欄&#xff0c;最后加上--remote-debugging-port9222 注意要用空格隔開 lanch.json 文件配置 …