詳解SQLAlchemy的函數relationship

在 SQLAlchemy 中,relationship 是一個非常重要的函數,用于定義模型之間的關系。它用于在 ORM 層面上表示數據庫表之間的關聯關系(如 1 對 1、1 對多和多對多)。relationship 的主要作用是提供一個高級接口,用于在模型之間導航和操作關聯數據。

relationship 的基本用法

relationship 函數通常定義在模型類中,用于指定兩個模型之間的關系。它的基本語法如下:

Python復制

relationship(argument, secondary=None, primaryjoin=None, secondaryjoin=None, backref=None, back_populates=None, uselist=True, order_by=False, lazy='select', viewonly=False, ...)

關鍵參數詳解

1. argument

這是 relationship 函數的第一個位置參數,通常是一個字符串,表示目標模型的類名。例如:

class Parent(Base):__tablename__ = 'parents'id = Column(Integer, primary_key=True)children = relationship("Child")  # 指向 Child 模型
2. back_populates

用于雙向關系的設置。它指定在目標模型中,哪個字段會反向引用當前模型。back_populates 是 SQLAlchemy 1.0 之后推薦的雙向關系設置方式,替代了舊版本的 backref
例如:

class Parent(Base):__tablename__ = 'parents'id = Column(Integer, primary_key=True)children = relationship("Child", back_populates="parent")class Child(Base):__tablename__ = 'children'id = Column(Integer, primary_key=True)parent_id = Column(Integer, ForeignKey('parents.id'))parent = relationship("Parent", back_populates="children")

在上述代碼中,ParentchildrenChildparent 通過 back_populates 建立了雙向關系。

3. backref

backref 是一個較老的參數,用于在目標模型中自動創建一個反向引用字段。它是一個字符串,表示在目標模型中創建的字段名稱。
例如:

class Parent(Base):__tablename__ = 'parents'id = Column(Integer, primary_key=True)children = relationship("Child", backref="parent")

Child 模型中會自動創建一個名為 parent 的字段,指向 Parent 模型。

注意backrefback_populates 是互斥的,不能同時使用。back_populates 是更推薦的方式,因為它更清晰地表達了雙向關系。

4. uselist

該參數用于指定關系是否為多對一或一對一。默認值為 True,表示多對一或一對多關系。如果設置為 False,則表示一對一關系。
例如:

class Parent(Base):__tablename__ = 'parents'id = Column(Integer, primary_key=True)child = relationship("Child", uselist=False)  # 一對一關系
5. secondary

用于多對多關系,指定關聯表。關聯表通常是一個 Table 對象,定義了兩個模型之間的多對多關系。
例如:

association_table = Table('association', Base.metadata,Column('parent_id', Integer, ForeignKey('parents.id')),Column('child_id', Integer, ForeignKey('children.id'))
)class Parent(Base):__tablename__ = 'parents'id = Column(Integer, primary_key=True)children = relationship("Child", secondary=association_table, back_populates="parents")class Child(Base):__tablename__ = 'children'id = Column(Integer, primary_key=True)parents = relationship("Parent", secondary=association_table, back_populates="children")
6. primaryjoinsecondaryjoin

這兩個參數用于顯式指定連接條件,通常在復雜的外鍵關系中使用。primaryjoin 指定主表的連接條件,secondaryjoin 指定目標表的連接條件。
例如:

class Parent(Base):__tablename__ = 'parents'id = Column(Integer, primary_key=True)children = relationship("Child", primaryjoin="Parent.id == Child.parent_id")class Child(Base):__tablename__ = 'children'id = Column(Integer, primary_key=True)parent_id = Column(Integer, ForeignKey('parents.id'))
7. lazy

該參數用于控制關聯對象的加載策略。常見值包括:

  • select:默認值,表示在訪問關聯對象時,會自動執行一個 SELECT 查詢。

  • joined:表示在加載主對象時,通過 JOIN 查詢同時加載關聯對象。

  • dynamic:表示返回一個查詢對象,而不是直接加載關聯對象,適合處理大量關聯數據。

例如:

class Parent(Base):__tablename__ = 'parents'id = Column(Integer, primary_key=True)children = relationship("Child", lazy="joined")  # 使用 JOIN 查詢加載關聯對象
8. order_by

用于指定關聯對象的排序方式。它接受一個列對象或字符串,表示排序的依據。
例如:

class Parent(Base):__tablename__ = 'parents'id = Column(Integer, primary_key=True)children = relationship("Child", order_by="Child.name")  # 按照 Child 的 name 字段排序
9. viewonly

該參數用于創建只讀關系。如果設置為 True,則不能通過該關系進行數據的添加、刪除或更新操作。
例如:

class Parent(Base):__tablename__ = 'parents'id = Column(Integer, primary_key=True)children = relationship("Child", viewonly=True)  # 只讀關系

總結

relationship 是 SQLAlchemy 中用于定義模型關系的核心函數,通過合理使用其參數,可以靈活地實現各種復雜的關系(如 1 對 1、1 對多和多對多)。以下是一些關鍵點:

  • 使用 back_populates 而非 backref,以更清晰地定義雙向關系。

  • 通過 uselist 控制關系類型(一對一或一對多)。

  • 使用 secondary 指定多對多關系的關聯表。

  • 通過 lazy 參數控制加載策略,優化性能。

  • 使用 order_by 指定關聯對象的排序方式。

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

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

相關文章

分桶函數的使用

除了 NTILE 函數,SQL 中還有其他一些與 分桶(bucketization)相關的函數,雖然它們的實現方式不同,但都涉及將數據分成多個區間或組。以下是一些常用的分桶函數: 1. CASE 語句 雖然 CASE 不是開窗函數&…

iOS 音頻錄制、播放與格式轉換

iOS 音頻錄制、播放與格式轉換:基于 AVFoundation 和 FFmpegKit 的實現 在 iOS 開發中,音頻處理是一個非常常見的需求,比如錄音、播放音頻、音頻格式轉換等。本文將詳細解讀一段基于 AVFoundation 和 FFmpegKit 的代碼,展示如何實現音頻錄制、播放以及 PCM 和 AAC 格式之間…

數據結構與算法(test1)

一、樹和二叉樹 1. 看圖,完成以下填空 (1).樹的度為________。 (2).樹中結點的最大層次,稱為樹的_____或樹的______,值是______。 (3).結點A和B的度分別為________ 和 ________。 (4).結點A是結點B的________。 (5).結點B是結點A的________…

新版AndroidStudio 修改 jdk版本

一、問題 之前,在安卓項目中配置JDK和Gradle的過程非常直觀,只需要進入Android Studio的File菜單中的Project Structure即可進行設置,十分方便。 如下圖可以在這修改JDK: 但是升級AndroidStudio之后,比如我升級到了Android Stu…

litemall,又一個小商場系統

litemall Spring Boot后端 Vue管理員前端 微信小程序用戶前端 Vue用戶移動端 代碼地址:litemall: 又一個小商城。 litemall Spring Boot后端 Vue管理員前端 微信小程序用戶前端 Vue用戶移動端

cursor 開發java項目教程簡單上手

1.官網下載 Cursor - The AI Code Editor 下載完后注冊賬號,可以使用無限郵的方式 注冊完之后 設置中文 可以選擇設置為中文 Ctrl Shift X 進入設置頁面輸入chinese 然后重啟 更改jdk跟maven倉庫設置 ctrlshiftp 打開輸入框后輸入json,把下面代碼…

安裝和使用 Ollama(實驗環境windows)

下載安裝 下載 https://ollama.com/download/windows 安裝 Windows 安裝 如果直接雙擊 OllamaSetup.exe 安裝,默認會安裝到 C 盤,如果需要指定安裝目錄,需要通過命令行指定安裝地址,如下: # 切換到安裝目錄 C:\Use…

[原創](Modern C++)現代C++的關鍵性概念: 文件編碼細節之一:BOM(Byte Order Mark, 字節順序標記)

常用網名: 豬頭三 出生日期: 1981.XX.XX 企鵝交流: 643439947 個人網站: 80x86匯編小站 編程生涯: 2001年~至今[共24年] 職業生涯: 22年 開發語言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 開發工具: Visual Studio、Delphi、XCode、Eclipse、C Bui…

LQB(0)-python-基礎知識

一、Python開發環境與基礎知識 python解釋器:用于解釋python代碼 方式: 1.直接安裝python解釋器 2.安裝Anaconda管理python環境 python開發環境:用于編寫python代碼 1.vscode 2.pycharm # 3.安裝Anaconda后可以使用網頁版的jupyter n…

C# 中記錄(Record)詳解

從C#9.0開始,我們有了一個有趣的語法糖:記錄(record)   為什么提供記錄? 開發過程中,我們往往會創建一些簡單的實體,它們僅僅擁有一些簡單的屬性,可能還有幾個簡單的方法,比如DTO等等&#xf…

使用 CSS 實現透明效果

在 CSS 中,實現透明效果有幾種方法,具體使用哪種方法取決于具體需求。以下是一些常見的方法: 使用 opacity 屬性: opacity 屬性可以設置整個元素的透明度,包括其所有的子元素。 .transparent { opacity: 0.5; /* 0 表…

MS17-010(永恒之藍1.0)漏洞遠程控制win7系統操作實戰小白通俗易懂

1.準備環境win7操作系統(被攻擊機)以及kali系統(攻擊機),kali使用msf工具進行攻擊。 2.打開kali終端,進入msf,輸入msfconsole然后等待啟動。 ┌──(root?kali-chifan)-[~] └─# msfconsole…

C語言:函數棧幀的創建和銷毀

目錄 1.什么是函數棧幀2.理解函數棧幀能解決什么問題3.函數棧幀的創建和銷毀的過程解析3.1 什么是棧3.2 認識相關寄存器和匯編指令3.3 解析函數棧幀的創建和銷毀過程3.3.1 準備環境3.3.2 函數的調用堆棧3.3.3 轉到反匯編3.3.4 函數棧幀的創建和銷毀 1.什么是函數棧幀 在寫C語言…

25/2/6 <機器人基礎> 運動學中各連桿的變換矩陣求法

變換矩陣 機器人通常包含多個關節和連桿,每個關節和連桿都有自己的局部坐標系。變換矩陣能夠將一個點或向量從一個坐標系轉換到另一個坐標系,從而實現對機器人各個部件位置和姿態的統一描述 變換矩陣能夠將復雜的運動分解為旋轉和平移的組合。通過矩陣乘…

AllData數據中臺核心菜單十二:數據同步平臺

🔥🔥 AllData大數據產品是可定義數據中臺,以數據平臺為底座,以數據中臺為橋梁,以機器學習平臺為中層框架,以大模型應用為上游產品,提供全鏈路數字化解決方案。 ?奧零數據科技官網:…

【FPGA】 MIPS 12條整數指令 【3】

實現乘除 修改框架 EX:實現帶符號乘除法和無符號乘除法 HiLo寄存器:用于存放乘法和除法的運算結果。Hi、Lo為32bit寄存器。電路描述與實現RegFile思想一致 仿真 代碼 DataMem.v include "define.v"; module DataMem(input wire clk,input…

【原子工具】快速冪 快速乘

題冪算.一切即1 陰陽迭變積微著,疊浪層巒瞬息功 莫道浮生千萬事,元知萬象一歸宗 文章目錄 快速冪原始快速冪(O(logn))二分遞歸形式非遞歸形式 模下意義的快速冪(O(logn))二分遞歸形式非遞歸形式 快速乘龜速…

文件基礎IO

理解"文件" 1-1 狹義理解 文件在磁盤里磁盤是永久性存儲介質,因此文件在磁盤上的存儲是永久性的磁盤是外設(即是輸出設備也是輸入設備)磁盤上的文件 本質是對文件的所有操作,都是對外設的輸入和輸出簡稱IO 1-2 廣義理…

Unity 簡易的UI框架

核心內容 UIType.cs namespace MYTOOL.UI {/// <summary>/// UI層級/// </summary>public enum UILayer{/// <summary>/// 主界面層/// </summary>MainUI 0,/// <summary>/// 普通界面層/// </summary>NormalUI 1,/// <summary>/…

VUE2雙向綁定的原理

文章目錄 VUE2雙向綁定的原理1. 什么是雙向綁定2. 雙向綁定的原理2.1 ViewModel的重要作用2.2 雙向綁定的流程 3. 雙向綁定的實現3.1 data響應化處理3.2 Compile編譯3.3 依賴收集 VUE2雙向綁定的原理 1. 什么是雙向綁定 講雙向綁定先講單項綁定&#xff0c;啥叫單項綁定&…