新手教程系列 -- SQLAlchemy对同一张表联表两次

在开发过程中,我们经常会遇到对同一张表进行多次联表查询的需求。比如在查询航线时,我们希望将起飞和降落的机场名称代入结果中。为了实现这一目标,机场名称统一存放在 AirPort 表中。下面,我们将介绍如何通过 SQLAlchemy 实现这一需求。

问题描述

一般情况我们第一时间会想到这么写:

from sqlalchemy import select
async with get_db_session_async() as session:stmt = (select(AirRoute.dep_airport_code,AirPort.airport_en_name.label('dep_airport_name'),AirRoute.arr_airport_code,AirPort.airport_en_name.label('arr_airport_name'),ResourceSite.site_code,ResourceSite.site_name,ResourceSite.flight_code,).join(ResourceSite, AirRoute.resource_site_id == ResourceSite.id, isouter=True).join(AirPort, AirRoute.dep_airport_code == AirPort.airport_code, isouter=True).join(AirPort, AirRoute.arr_airport_code == AirPort.airport_code, isouter=True).limit(1))row_set = await session.execute(stmt)air_route_rows = [row._asdict() for row in row_set.all()]

然而,运行上面的代码时,会得到一个错误:

OperationalError: (pymysql.err.OperationalError) (1066, "Not unique table/alias: 'air_ports'")

这个错误是由于在同一个查询中多次引用同一张表 AirPort,导致表别名冲突。

解决方案:使用别名(aliased)

为了解决上述问题,我们可以使用 SQLAlchemy 提供的 aliased 方法。通过为同一张表创建不同的别名,可以避免表别名冲突。

  • 注意:不同版本的 SQLAlchemy 可能 aliased 存放的包路径不一样,具体请以您使用的 SQLAlchemy 版本为准
from sqlalchemy import select
from sqlalchemy.orm import aliasedasync with get_db_session_async() as session:dep_airports_table = aliased(AirPort, name='dep_airports_table')arr_airports_table = aliased(AirPort, name='arr_airports_table')stmt = (select(AirRoute.dep_airport_code,dep_airports_table.airport_en_name.label('dep_airport_name'),AirRoute.arr_airport_code,arr_airports_table.airport_en_name.label('arr_airport_name'),ResourceSite.site_code,ResourceSite.site_name,ResourceSite.flight_code,).join(ResourceSite, AirRoute.resource_site_id == ResourceSite.id, isouter=True).join(dep_airports_table, AirRoute.dep_airport_code == dep_airports_table.airport_code, isouter=True).join(arr_airports_table, AirRoute.arr_airport_code == arr_airports_table.airport_code, isouter=True).limit(1))row_set = await session.execute(stmt)air_route_rows = [row._asdict() for row in row_set.all()]

通过为 AirPort 表生成两个别名对象 depairportstable 和 arrairportstable,我们可以分别进行联表查询,避免了别名冲突问题。

最终结果

经过修改,我们成功对 AirPort 表生成了两个别名对象,并通过这两个对象进行联表查询,得到了正确的结果:

[{'dep_airport_code': 'ADB', 'dep_airport_name': 'Adnan Menderes Airport', 'arr_airport_code': 'SIN', 'arr_airport_name': 'Singapore Changi Airport', 'site_code': 'xxx', 'site_name': 'Example Site', 'flight_code': 'XX123'}]

通过以上步骤,我们解决了 SQLAlchemy 对同一张表进行多次联表查询时的别名冲突问题,使查询结果更加准确和直观。

结论

在开发中,对同一张表进行多次联表查询是一个常见需求。通过使用 SQLAlchemy 的 aliased 方法,可以有效避免表别名冲突问题,从而实现预期的查询结果。希望这篇教程能帮助你更好地理解和应用 SQLAlchemy 进行复杂查询。

关注【程序员的开发手册】,让您少走十年弯路!

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

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

相关文章

多线程编程基础与并发问题解决方案

多线程编程基础与并发问题解决方案 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 引言 在现代软件开发中,多线程编程成为了处理并发任务和提升程…

[漏洞分析] CVE-2024-6387 OpenSSH核弹核的并不是很弹

文章目录 漏洞简介漏洞原理补丁分析漏洞原理 漏洞利用漏洞利用1: SSH-2.0-OpenSSH_3.4p1 Debian 1:3.4p1-1.woody.3 (Debian 3.0r6, from 2005) [无ASLR无NX]漏洞利用原理漏洞利用关键点 漏洞利用2: SSH-2.0-OpenSSH_4.2p1 Debian-7ubuntu3 (Ubuntu 6.06.1, from 2006) [无ASLR…

Hadoop集群误删数据紧急恢复详细步骤

1、发现集群误删数据处理 与现场核实是否可以停止集群,建议立即停止集群,减少数据丢失数据。 2、第一时间检查Fsimage文件,确认是否存在可用于数据恢复的Fsimage文件。 最新checkpoint的元数据只有原来的1/4,故使用离当前时间点最…

Python爬虫之爬虫逆向常见的加密方式

Python爬虫之爬虫逆向常见的加密方式 在Python爬虫领域,数据加密是一个重要的议题,尤其是在处理敏感信息或需要绕过网站的反爬虫机制时。下面,我们将探讨一些常见的数据加密方式,以及它们在Python爬虫中的应用。 常见的数据加密…

PD/PPS适配器/充电器高频快速AC-DC充电器芯片

概述 PC1067 是一款集成 GaN 功率器件的高频准谐振反激控制器,适合设计在离线式 USB-PD和USB Type-C 等快速充电器和电源供应器方案,待机功耗小于 75mW。 PC1067 集成全面的保护功能,包括逐周期过流保护(OCP)&#x…

library source does not match the bytecode for class SpringApplication

library source does not match the bytecode for class SpringApplication 问题描述:springboot源码点进去然后download source后提示标题内容。spring版本5.2.8.RELEASE,springboot版本2.7.18 解决方法:把spring版本改为与boot版本对应的6.…

一键搞定长图处理:高效精准,轻松实现按固定高度像素切割

在数字时代,图像已经成为我们日常生活中不可或缺的一部分。无论是网页设计、广告海报,还是社交媒体分享,图像都在扮演着至关重要的角色。但是,当你面临一张长长的图片,需要按照特定的尺寸进行切割时,你是否…

物流行业:智能物流跟踪

在现代物流中,RFID技术的应用已经成为提高运输效率和安全性的重要手段。RFID标签可以被轻松地附加到货物上,并能够实时记录物品的位置和状态。通过这些标签,物流公司可以实时追踪货物的运输路径,监控货物的运输状况,确…

Docker 部署 Minio 对象存储服务器

文章目录 Github官网文档简介dockerdocker-compose.ymlmc 客户端mc 基础命令Golang 示例创建 test 账号密钥文件上传示例 Github https://github.com/minio/minio 官网 https://min.io/https://www.minio.org.cn/ 文档 https://www.minio.org.cn/docs/minio/kubernetes/up…

解决跨域问题(vite、axios/koa)

两种方法选其一即可 一、后端koa设置中间件 app.use(async (ctx, next)> {ctx.set(Access-Control-Allow-Origin, *);ctx.set(Access-Control-Allow-Headers, Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild);ctx.set(Access-C…

hamibot 学习

1.参考文档: https://blog.csdn.net/zxl0428/article/details/1285318731.参考官网 快速入手步骤:注册,安装客户端,添加设备,开发脚本,运行脚本 https://hamibot.com/guide1.安装客户端 2.添加设备 …

【Python网络爬虫案例】python爬虫之模拟登录

🔗 运行环境:PYTHON 🚩 撰写作者:左手の明天 🥇 精选专栏:《python》 🔥 推荐专栏:《算法研究》 #### 防伪水印——左手の明天 #### 💗 大家好🤗&#x1f91…

如何为董事会会议做准备?【会前会后】

召开一场富有成效的董事会会议需要花费大量的时间,可能要进行数周的沟通和拉扯,这些对董事做好充分准备至关重要。真实情况下的董事会会议往往需要大量的时间来准备,使用董事会会议工具能有效节省董事会会议准备时间、提高效率,保…

java常见集合容器的扩容增量

java常见集合容器的扩容增量 汇总: ArrayList:默认初始容量为10,扩容为原容量的1.5倍加1 Vector:默认初始容量为10,扩容为原容量的2倍 HashSet:默认初始容量为16,扩容为原容量的2倍&#xff0…

SQL游标的原理与在数据库操作中的应用

SQL游标的原理与在数据库操作中的应用 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 引言 在关系型数据库中,SQL游标(Cursor&#x…

【nginx】nginx配置websocket

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…

MySQL5.7安装初始化错误解决方案

问题背景 今天在给公司配数据库环境时,第一次报initializing database 数据库初始化错误? 起初没管以为是安装软件原因,然后就出现以下错误:如下图 点开log,我们观察日志会发现 无法识别的参数 ‘mysqlx_port=0.0’,???,官方的安装程序还能出这问题?

LabVIEW风机跑合监控系统

开发了一种基于LabVIEW的风机跑合监控系统,提高风机测试的效率和安全性。系统通过自动控制风机的启停、实时监控电流和功率数据,并具有过流保护功能,有效减少了人工操作和安全隐患,提升了工业设备测试的自动化和智能化水平。 项目…

仓库管理系统25--数据导出

原创不易&#xff0c;打字不易&#xff0c;截图不易&#xff0c;多多点赞&#xff0c;送人玫瑰&#xff0c;留有余香&#xff0c;财务自由明日实现 1、添加用户控件 <UserControl x:Class"West.StoreMgr.View.DataExportView"xmlns"http://schemas.microsof…

全年免费!环信发布出海创新版,助力泛娱乐创业者扬帆起航

目前&#xff0c;以陌生人社交、直播、语聊、电商等热门场景为代表的社交泛娱乐出海正发展得如火如荼&#xff0c;成为企业新的增长曲线。但随着出海企业增多&#xff0c;海外市场争夺、资源竞争与技术博弈也愈加激烈。 为了让更多创业者与创新者获得支持&#xff0c;快速高效…