软件测试|sqlalchemy relationship

简介

SQLAlchemy是一个流行的Python ORM(对象关系映射)库,它允许我们以面向对象的方式管理数据库。在SQLAlchemy中,relationship是一个重要的功能,用于建立表之间的关系。在本文中,我们将详细探讨relationship中的backrefback_populates参数的使用,以及如何使用它们来管理关系。

relationship的基本概念

在SQLAlchemy中,relationship用于定义表之间的关系。它通常用于两个表之间的外键关系,允许在Python对象中表示这种关系。考虑一个示例,其中有两个表:UserAddress,User表包含用户信息,Address表包含用户的邮寄地址。我们可以使用relationship定义这两个表之间的关系。

from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship, sessionmaker
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    
    id = Column(Integer, primary_key=True)
    name = Column(String)
    addresses = relationship('Address', back_populates='user')

class Address(Base):
    __tablename__ = 'addresses'
    
    id = Column(Integer, primary_key=True)
    email = Column(String)
    user_id = Column(Integer, ForeignKey('users.id'))
    user = relationship('User', back_populates='addresses')

engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()

在上面的示例中,UserAddress之间建立了双向关系,通过useraddresses属性进行关联。但要注意,back_populatesbackref参数还没有用到。

backref参数的使用

backref参数用于在关联对象的另一侧创建反向引用。这将使我们能够轻松访问关系的反向方向。在上面的示例中,我们可以使用backref参数来为User表创建一个反向引用,从而能够访问与User关联的Address对象。

class User(Base):
    __tablename__ = 'users'
    
    id = Column(Integer, primary_key=True)
    name = Column(String)
    addresses = relationship('Address', back_populates='user')

class Address(Base):
    __tablename__ = 'addresses'
    
    id = Column(Integer, primary_key=True)
    email = Column(String)
    user_id = Column(Integer, ForeignKey('users.id'))
    user = relationship('User', back_populates='addresses', backref='user')

现在,我们可以使用user属性访问与User表关联的Address对象,如下所示:

user = session.query(User).first()
addresses = user.user.addresses

back_populates 参数的使用

back_populates参数用于在两个关联的表之间建立双向关系,从而确保双向关系的一致性。在上面的示例中,我们已经在UserAddress之间建立了双向关系,使用back_populates参数可以更好地管理这种关系。

class User(Base):
    __tablename__ = 'users'
    
    id = Column(Integer, primary_key=True)
    name = Column(String)
    addresses = relationship('Address', back_populates='user')

class Address(Base):
    __tablename__ = 'addresses'
    
    id = Column(Integer, primary_key=True)
    email = Column(String)
    user_id = Column(Integer, ForeignKey('users.id'))
    user = relationship('User', back_populates='addresses')

这样,当我们添加一个新的地址到User对象时,关系将会自动同步:

user = User(name='John')
address = Address(email='john@example.com')
user.addresses.append(address)
session.add(user)
session.commit()

# 现在,user和address对象之间的关系已经建立

back_populates参数确保双向关系的一致性,不需要手动同步关联。

总结

在SQLAlchemy中,relationship是用于定义表之间关系的强大工具。backrefback_populates参数允许我们轻松地创建双向关系,并管理关系的一致性。通过使用这些参数,我们可以更容易地访问和维护相关对象之间的关系,提高了代码的可读性和维护性。希望这篇文章对大家有所帮助,并能帮助大家更好地理解SQLAlchemy中relationship的使用。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/330706.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

渗透测试之Kali如何利用CVE-2019-0708漏洞渗透Win7

环境: 1.攻击者IP:192.168.1.10 系统: KALI2022(vmware 16.0) 2.靶机IP:192.168.1.8 系统:Windows 7 6.1.7601 Service Pack 1 Build 7601 已开启远程协助RDP服务开启了3389端口 问题描述: KALI 如何利用CVE-2019-0708漏洞渗透Win7 解决方案: 1.打开kali,msf搜索…

[足式机器人]Part2 Dr. CAN学习笔记- Kalman Filter卡尔曼滤波器Ch05

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记 - Kalman Filter卡尔曼滤波器 Ch05 1. Recursive Algirithm 递归算法2. Data Fusion 数据融合Covarince Matrix协方差矩阵State Space状态空间方程 Observation观测器3. Step by step : Deriatio…

在自定义数据集上训练 YOLOv8 进行目标检测

这是目标检测中令人惊叹的 AI 模型之一。在这种情况下,您无需克隆存储库、设置要求并配置模型,就像在 YOLOv5 及其之前的版本中所做的那样。 在 YOLOv8 中,不需要执行这些手动任务。您只需安装 Ultralytics 即可,我将向您展示如何…

mybatis----小细节

1、起别名 在MyBatis中&#xff0c;<typeAliases>元素用于定义类型别名&#xff0c;它可以将Java类名映射为一个更简短的别名&#xff0c;这样在映射文件中可以直接使用别名而不需要完整的类名。 下面是一个示例&#xff1a; 在mybatis核心配置文件中配置typeAliases标…

[go语言]输入输出

目录 知识结构 输入 1.Scan ​编辑 2.Scanf 3.Scanln 4.os.Stdin --标准输入&#xff0c;从键盘输入 输出 1.Print 2.Printf 3.Println 知识结构 输入 为了展示集中输入的区别&#xff0c;将直接进行代码演示。 三者区别的结论&#xff1a;Scanf格式化输入&#x…

“深度剖析Nginx的高级部署“

深度剖析Nginx的高级部署与优化技巧 引言1. Nginx基础概念1.1 Nginx简介1.1.1 什么是Nginx&#xff1f;1.1.2 Nginx的特点与优势 2. Nginx部署安装MySQL运行java 总结 引言 在现代网络架构中&#xff0c;Nginx作为一款高性能的开源Web服务器&#xff0c;广泛应用于反向代理、负…

个人网站制作 Part 8 添加电子邮件通知与社交媒体集成 | Web开发项目

文章目录 &#x1f469;‍&#x1f4bb; 基础Web开发练手项目系列&#xff1a;个人网站制作&#x1f680; 添加电子邮件通知&#x1f528;使用Nodemailer&#x1f527;步骤 1: 安装Nodemailer &#x1f680; 社交媒体集成&#x1f528;使用社交媒体API&#x1f527;步骤 2: 集成…

Springcloud+Vue智慧工地源码 AI智能识别

智慧工地解决方案 一、现状描述 建筑工程建设具有明显的生产规模大宗性与生产场所固定性的特点。建筑企业70%左右的工作都发生在施工现场&#xff0c;施工阶段的现场管理对工程成本、进度、质量及安全等至关重要。同时随着工程建设规模不断扩大&#xff0c;工艺流程纷繁复杂&…

通讯录(C语言版)(静态通讯录)

✨欢迎来到脑子不好的小菜鸟的文章✨ &#x1f388;创作不易&#xff0c;麻烦点点赞哦&#x1f388; 所属专栏&#xff1a;项目 我的主页&#xff1a;脑子不好的小菜鸟 文章特点&#xff1a;关键点和步骤讲解放在 代码相应位置 引言&#xff1a; 1.菜单 通讯录也如同游戏&…

pyspark 笔记:窗口函数window

窗口函数相关的概念和基本规范可以见&#xff1a;pyspark笔记&#xff1a;over-CSDN博客 1 创建Pyspark dataFrame from pyspark.sql.window import Window import pyspark.sql.functions as F employee_salary [("Ali", "Sales", 8000),("Bob&qu…

JFlash工具将多个Bin文件或hex文件合并成一个(app+bootloader)

开发过程中&#xff0c;会遇到需要将多个bin文件合并成一个bin文件&#xff0c;尤其是需要将bootloader文件和App文件合并成一个文件。 1.使用version6.8下载地址&#xff1a;https://www.segger.com/downloads/jlink/ 2.芯片运行的起始地址:J-Flash工具可以根据选择的芯片类型…

el-date-picker默认结束为当前时分秒

在element ui中的日期时间选择组件中默认是00:00,现在需求是点击默认结束时间为当前时分秒&#xff0c;查了很多资料写的都不准确 需求&#xff1a;实现日期时间组件可选择当前日期&#xff0c;比如当前是2024年01月17号下午17&#xff1a;21 那选中时必须结束时间为17&#x…

JQuery 操作Class滚动轮播展示效果

JQuery 操作Class滚动轮播展示效果 展示效果&#xff1a; 1.html <div class"list"><div class"item"><div class"icon"></div><div class"content">第一行xxxxxxxxx</div></div><div …

图解第五代英特尔至强可扩展处理器

四年五节点&#xff0c;一年出两代。在年初推出代号Sapphire Rapids&#xff08;蓝宝石激流&#xff0c;SPR&#xff09;的第四代英特尔至强可扩展处理器之后&#xff0c;仅隔11个月&#xff0c;代号Emerald Rapids&#xff08;绿宝石激流&#xff0c;EMR&#xff09;的第五代英…

uniapp写微信小程序实现电子签名

写电子签名一定要注意的是一切全部按照手机上的适配来&#xff0c;为啥这么说呢&#xff0c;因为你在微信开发者工具中调试的时候认为是好的&#xff0c;正常的非常nice,当你发布版本的时候你会发现问题出来了。我下边的写法你可以直接用很简单。就是要记住canvas的几个属性和用…

CSC8021_computer network_The Application Layer

The Role of the Application layer The Application layer is the interface between the network and its users › It contains network services (e.g. DNS) › It contains user applications (e.g. email, web browsing&#xff09; Domain Name System (DNS) › The …

51单片机_智能家居终端

实物演示效果&#xff1a; https://www.bilibili.com/video/BV1bh4y1A7ZW/?vd_source6ff7cd03af95cd504b60511ef9373a1d 51单片机是否适合做多功能智能家居控制系统&#xff1f;51单片机的芯片是否具有与WiFi通信的能力&#xff1f;如果有的话&#xff0c;具体有哪些芯片啊&a…

安泰高压放大器设计的意义及其应用价值

高压放大器的设计是电子工程领域中的重要课题。其意义在于提供强大的放大能力&#xff0c;将高电压信号放大到所需的输出水平。高压放大器在多个领域具有广泛应用&#xff0c;包括科学研究、医疗设备、工业驱动和能量传输等。下面安泰电子将带来高压放大器设计的意义和其所带来…

豆瓣酱生产加工污水处理需要哪些工艺设备

酱生产加工工程中&#xff0c;污水处理是一个至关重要的环节。豆瓣酱作为一种传统的食品调料&#xff0c;由于其酱豆和辅料的混合&#xff0c;往往会产生大量的污水。为了实现环境友好型生产&#xff0c;保护我们的大自然&#xff0c;豆瓣酱生产厂家需要采用一些科学先进的工艺…