软件测试|sqlalchemy relationship

news2024/11/28 0:56:02

简介

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的使用。

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

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

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

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

相关文章

阿里云国外云服务器地域、收费标准及活动报价2024新版

阿里云国外服务器优惠活动「全球云服务器精选特惠」,国外服务器租用价格24元一个月起,免备案适合搭建网站,部署独立站等业务场景,阿里云服务器网aliyunfuwuqi.com分享阿里云国外服务器优惠活动: 全球云服务器精选特惠…

【前后端的那些事】评论功能实现

文章目录 聊天模块1. 数据库表2. 后端初始化2.1 controller2.2 service2.3 dao2.4 mapper 3. 前端初始化3.1 路由创建3.2 目录创建3.3 tailwindCSS安装 4. tailwindUI5. 前端代码编写 前言:最近写项目,发现了一些很有意思的功能,想写文章&…

Power Designer 连接 PostgreSQL 逆向工程生成pd表结构操作步骤以及过程中出现的问题解决

一、使用PowerDesigner16.5 链接pg数据库 1.1、启动PD.选择Create Model…。 1.2、选择Model types / Physical Data Model Physical Diagram:选择pgsql直接【ok】 1.3、选择connect 在工具栏选择Database-Connect… 快捷键:ctrlshiftN.如下图&#xff…

第八站:C++面向对象(继承和派生)

继承和派生 派生:由父类派生出子类 继承:子类继承父类(继承不会继承析构函数和构造函数:父类的所有成员函数,以及数据成员,都会被子类继承!) "子类派生出的类"会指向"父类被继承的类",父类就是基类 实例1: 先创建一个父…

Flask框架小程序后端分离开发学习笔记《2》构建基础的HTTP服务器

Flask框架小程序后端分离开发学习笔记《2》构建基础的HTTP服务器 Flask是使用python的后端,由于小程序需要后端开发,遂学习一下后端开发。本节提供一个构建简单的本地服务器的代码,仔细看注释,学习每一步的流程,理解服…

react-app框架——使用monaco editor实现online编辑html代码编辑器

文章目录 ⭐前言💖react系列文章 ⭐配置monaco-editor💖引入react-monaco-editor💖引入react-app-rewired💖通过config-overrides.js添加monaco插件配置 ⭐编辑代码的react页面配置💖扩展 可自定义配置语言 ⭐效果⭐总…

使用 mybatis-plus 的mybaits的一对多时, total和record的不匹配问题

应该是框架的问题,去官方仓库提了个issues,等回复 https://github.com/baomidou/mybatis-plus/issues/5923 背景 发现 record是两条,但是total显示3 使用resultMap一对多时,三条数据会变成两条,但是total确是3条 下…

新能源汽车智慧充电桩方案:基于视频监控的可视化智能监管平台

一、方案概述 TSINGSEE青犀&触角云新能源汽车智慧充电桩方案围绕互联网、物联网、车联网、人工智能、视频技术、大数据、4G/5G等技术,结合云计算、移动支付等,实现充电停车一体化、充电桩与站点管理等功能,达到充电设备与站点的有效监控…

[足式机器人]Part2 Dr. CAN学习笔记-Ch04 Advanced控制理论

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记 - Ch04 Advanced控制理论 1. 绪论2. 状态空间表达State-Space Representation3. Phase Portrait相图,相轨迹3 1. 1-D3 2. 2-D3 3. General Form3 4. Summary3.5. 爱情中的数学-Phase …

Luckysheet类似excel的在线表格(vue)

参考文档&#xff1a;快速上手 | Luckysheet文档 一、引入 在vue项目的public文件夹下的index.html的<head>标签里面引入 <link relstylesheet hrefhttps://cdn.jsdelivr.net/npm/luckysheetlatest/dist/plugins/css/pluginsCss.css /><link relstylesheet hre…

使用 Neo4j 和 LangChain 集成非结构化知识图增强 QA

目前基于大模型的信息检索有两种方法&#xff0c;一种是基于微调的方法&#xff0c;一种是基于 RAG 的方法。 信息检索和知识提取是一个不断发展的领域&#xff0c;随着大型语言模型&#xff08;LLM&#xff09;和知识图的出现&#xff0c;这一领域发生了显着的变化&#xff0…

河南选调生报名照片上传成功,不能大于50kb

河南选调生报名照片要求&#xff1a; 1、上传近期正面免冠证件照 2、照片背景&#xff1a;要求为蓝底 3、照片格式&#xff1a;jpg格式 4、照片宽高比例约为1.3:1.6&#xff0c;大小为130160像素 5、照片大小&#xff1a;50kb以下&#xff0c;最终效果以输出后的大小为准

pytest学习和使用-pytest如何进行分布式测试?(pytest-xdist)

1 什么是分布式测试&#xff1f; 在进行本文之前&#xff0c;先了解些基础知识&#xff0c;什么是分布式测试&#xff1f;分布式测试&#xff1a;是指通过局域网和Internet&#xff0c;把分布于不同地点、独立完成特定功能的测试计算机连接起来&#xff0c;以达到测试资源共享…

SpringMVC JSON数据处理见解6

6.JSON数据处理 6.1.添加json依赖 springmvc 默认使用jackson作为json类库,不需要修改applicationContext-servlet.xml任何配置&#xff0c;只需引入以下类库springmvc就可以处理json数据&#xff1a; <!--spring-json依赖--> <dependency><groupId>com.f…

群晖搭建LDAP服务器实现一个账号登录DSM、Gitea、jellyfin

文章目录 前言安装LDAP Server新建群组新增用户 DSM加入LDAPDSM使用LDAP登录 Gitea配置登录取消其登录权限 Jellyfin配置登录 总结 前言 LDAP&#xff08;轻量级目录访问协议&#xff09;是一种用于访问和管理分布式目录服务的协议&#xff0c;它具有以下好处&#xff1a; 集…

flutter开发windows桌面软件,使用Inno Setup打包成安装程序,支持中文

最近使用flutter开发windows桌面软件的时候&#xff0c;想要将软件打包成安装程序&#xff0c;使用了flutter官方推荐的msix打包&#xff0c;但是打包出来的软件生成的桌面快捷方式有蓝色背景&#xff1a; 这个蓝色背景应该是没有设置为动态导致的&#xff0c;windows系统的屏幕…

POE工业交换机:点亮灯光控制与建筑自动化的新时代

随着科技的不断发展&#xff0c;灯光控制和建筑自动化在现代建筑中扮演着重要角色。而POE工业交换机作为一种创新的网络设备&#xff0c;不仅能够为灯光控制和建筑自动化提供稳定可靠的网络通信&#xff0c;还具备便捷的供电功能。本文将探讨POE工业交换机对灯光控制和建筑自动…

Unity URP切换品质和Feature开关的性能问题

现在对我的项目进行安卓端发布&#xff0c;需要切换品质和一些Feature开关。 我是这样做的。 划分品质 首先Renerer分为2个Android和PC&#xff0c;图中其他不用参考。 每个副本的URP Asset分为pc和android&#xff0c;例如图中的 hall和hall_android。 我们可以看到hall用的…

【性能调优】local模式模式下flink处理离线任务能力分析

文章目录 一. flink的内存管理1.Jobmanager的内存模型2.TaskManager的内存模型2.1. 模型说明2.2. 通讯、数据传输方面2.3. 框架、任务堆外内存2.4. 托管内存 3.任务分析 二. 单个节点的带宽瓶颈1. 带宽相关理论2. 使用speedtest-cli 测试带宽3. 任务分析3. 其他工具使用介绍 本…

使用CSS计算高度铺满屏幕

前言 今天写项目时出现高度设置百分百却不占满屏幕&#xff0c;第一反应看自己设置的是块级元素还是行级元素。看了几篇博客&#xff0c;发现并不能解决问题。脱离文档流的做法都没考虑&#xff0c;前期模板搭建脱离文档流&#xff0c;后面开发会出现很多问题。 以上图片是我…