详解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.mzph.cn/news/894869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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…

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…

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 表…

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…

文件基础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;啥叫单项绑定&…

4G核心网的演变与创新:从传统到虚拟化的跨越

4G核心网 随着移动通信技术的不断发展&#xff0c;4G核心网已经经历了从传统的硬件密集型架构到现代化、虚拟化网络架构的重大转型。这一演变不仅提升了网络的灵活性和可扩展性&#xff0c;也为未来的5G、物联网&#xff08;LOT&#xff09;和边缘计算等技术的发展奠定了基础。…

HTML排版标签、语义化标签、块级和行内元素详解

目录 前言 一、HTML中的排版标签 1. 文本相关标签 1.1 标题标签 ~ 1.2 段落标签 1.3 强调和加粗 1.4 换行标签 1.5 水平线标签 二、HTML中的语义化标签 2.1 语义化标签概述 2.2 常见的语义化标签 示例&#xff08;核心代码部分&#xff09;&#xff1a; 三、HTM…

【字节青训营-7】:初探 Kitex 字节微服务框架(使用ETCD进行服务注册与发现)

本文目录 一、Kitex概述二、第一个Kitex应用三、IDL四、服务注册与发现 一、Kitex概述 长话短说&#xff0c;就是字节跳动内部的 Golang 微服务 RPC 框架&#xff0c;具有高性能、强可扩展的特点&#xff0c;在字节内部已广泛使用。 如果对微服务性能有要求&#xff0c;又希望…

【数学】矩阵、向量(内含矩阵乘法C++)

目录 一、前置知识&#xff1a;向量&#xff08;一列或一行的矩阵&#xff09;、矩阵1. 行向量2. 列向量3. 向量其余基本概念4. 矩阵基本概念5. 关于它们的细节 二、运算1. 转置&#xff08;1&#xff09;定义&#xff08;2&#xff09;性质 2. 矩阵&#xff08;向量&#xff0…

浅尝yolo11全程记录1-准备环境+官网模型推理(个人备份)

准备工作&#xff08;虚拟环境、导入项目&#xff09; 安装Anaconda 主要是为了创建和管理虚拟环境&#xff0c;在pycharm里按照项目里的requirments.txt安装依赖的时候&#xff0c;使用虚拟环境会好很多&#xff08;我记得不用Anaconda也可以直接在pycharm的terminal里头创建…