取消票证会把指定的票证从数据库中删除,同时也会把票证和航班 等相关表中的关联关系一起删除。但在删除之前,它会先检查当前用户是否拥有这张票
在做航班智能客服问答系统时会遇到取消票证的场景,这里涉及数据库的操作时会把指定的票证从数据库中删除,同时也会把票证和航班等相关表中的关联关系一起删除。但在删除之前,需要先检查当前用户是否拥有这张票,只有票主才有权限取消这张票。
下面用 Python 和 SQLAlchemy 举个简单的例子说明每行代码的意思:
def cancel_ticket(current_user_id, ticket_id):# 查询数据库中指定 ticket_id 的票证ticket = db.session.query(Ticket).filter_by(id=ticket_id).first()# 如果找不到票证,直接返回或抛出异常if ticket is None:raise Exception("票证不存在!")# 检查当前用户是否是票的所有者if ticket.user_id != current_user_id:raise Exception("您没有权限取消这张票!")# 删除票证与其他相关数据的关联# 例如,假设票证和航班表有外键关联,先删除关联记录related_flights = db.session.query(Flight).filter_by(ticket_id=ticket_id).all()for flight in related_flights:db.session.delete(flight)# 删除票证本身db.session.delete(ticket)# 提交事务,将所有变更保存到数据库中db.session.commit()
代码逐行解释:
-
定义函数
cancel_ticket(current_user_id, ticket_id):
接受当前用户的 ID 和要取消的票证 ID 作为参数。 -
查询票证:
ticket = db.session.query(Ticket).filter_by(id=ticket_id).first()这行代码从数据库中查找票证表(Ticket)中与
ticket_id匹配的记录。 -
检查票证是否存在:
if ticket is None:raise Exception("票证不存在!")如果没有找到票证,就抛出异常,提醒票证不存在。
-
验证当前用户是否拥有这张票:
if ticket.user_id != current_user_id:raise Exception("您没有权限取消这张票!")这行代码确保票证的所有者(
ticket.user_id)和当前用户的 ID 一致,只有票主才可以取消。 -
删除票证与航班等关联的数据:
related_flights = db.session.query(Flight).filter_by(ticket_id=ticket_id).all() for flight in related_flights:db.session.delete(flight)这里假设票证和航班表(Flight)有外键关联。首先查询所有与这张票有关联的航班记录,然后逐个删除它们。
-
删除票证本身:
db.session.delete(ticket)将票证从数据库中删除。
这里的db.session.delete是什么意思
-
提交事务:
db.session.commit()将所有删除操作一次性提交到数据库,确保数据的持久性。
生活中的比喻:
想象你要取消一个活动的入场券。在你开始取消之前,系统会先检查这个入场券是不是属于你,只有你的票才可以取消。如果票上还印有其他关联的信息(比如座位号、活动安排等),这些信息也会一并清除。这样做确保了只有票主能取消自己的票,并且不会留下无效的关联记录。
为什么代码中没有删除payment的代码,是不需要特意删除payment么?
在代码中没有看到删除 Payment 的部分,可能是因为数据库设计中已经设置了级联删除(Cascade Delete)。这意味着当删除 Ticket 时,与其关联的 Payment 记录会自动被数据库删除,无需在代码中显式地删除。
打个比方:
就像在一个树状结构中,删除了树枝后,所有挂在该树枝上的叶子也会自动掉落,这个过程不需要你手动去摘每一片叶子。
举例说明:
假设在数据库中 Ticket 和 Payment 表之间有外键关联,并且设置了 ON DELETE CASCADE。例如在 SQL 中创建表时可以这样定义:
CREATE TABLE Ticket (id SERIAL PRIMARY KEY,user_id INTEGER,-- 其他字段...
);CREATE TABLE Payment (id SERIAL PRIMARY KEY,ticket_id INTEGER REFERENCES Ticket(id) ON DELETE CASCADE,amount DECIMAL,-- 其他字段...
);
在这种设置下,当删除 Ticket 时,数据库会自动删除所有关联的 Payment 记录。因此,在代码中只需要删除 Ticket:
# 查询并删除票证
ticket = db.session.query(Ticket).filter_by(id=ticket_id).first()
if ticket:db.session.delete(ticket)db.session.commit() # 这时 Payment 记录会自动被删除
如果没有设置级联删除,则必须手动删除 Payment 记录,如下所示:
# 手动删除相关的 Payment 记录
payments = db.session.query(Payment).filter_by(ticket_id=ticket_id).all()
for payment in payments:db.session.delete(payment)# 删除票证
ticket = db.session.query(Ticket).filter_by(id=ticket_id).first()
if ticket:db.session.delete(ticket)db.session.commit()
总结来说,代码中没有专门删除 Payment,可能是因为数据库配置了级联删除,使得删除 Ticket 时,相关的 Payment 会自动删除。
数据库配置级联数删除 ON DELETE CASCADE 请点击查看更多介绍
相关文章:
取消票证会把指定的票证从数据库中删除,同时也会把票证和航班 等相关表中的关联关系一起删除。但在删除之前,它会先检查当前用户是否拥有这张票
在做航班智能客服问答系统时会遇到取消票证的场景,这里涉及数据库的操作时会把指定的票证从数据库中删除,同时也会把票证和航班等相关表中的关联关系一起删除。但在删除之前,需要先检查当前用户是否拥有这张票,只有票主才有权限取…...
力扣-贪心-763 划分字母区间
思路 先统计字符串中每一个字母出现的最后下标,然后从end初始化为第一个字母出现的最后下标,在i<end时,不断更新end,因为一旦囊括新的字母就最起码要遍历到新字母出现的最后下标,在i>end时,说明遍历…...
【Redis 原理】网络模型
文章目录 用户空间 && 内核空间阻塞IO非阻塞IO信号驱动IO异步IOIO多路复用selectpollepoll Web服务流程Redis 网络模型Redis单线程网络模型的整个流程Redis多线程网络模型的整个流程 用户空间 && 内核空间 为了避免用户应用导致冲突甚至内核崩溃,用…...
cpp中的继承
一、继承概念 在cpp中,封装、继承、多态是面向对象的三大特性。这里的继承就是允许已经存在的类(也就是基类)的基础上创建新类(派生类或者子类),从而实现代码的复用。 如上图所示,Person是基类&…...
DeepSeek全栈接入指南:从零到生产环境的深度实践
第一章:DeepSeek技术体系全景解析 1.1 认知DeepSeek技术生态 DeepSeek作为新一代人工智能技术平台,构建了覆盖算法开发、模型训练、服务部署的全链路技术栈。其核心能力体现在: 1.1.1 多模态智能引擎 自然语言处理:支持文本生成(NLG)、语义理解(NLU)、情感分析等计算…...
CSS 真的会阻塞文档解析吗?
在网页开发领域,一个常见的疑问是 CSS 是否会阻塞文档解析。理解这一问题对于优化网页性能、提升用户体验至关重要。要深入解答这个问题,需要从浏览器渲染网页的原理说起。 浏览器渲染网页的基本流程 浏览器在接收到 HTML 文档后,会依次进行…...
大模型的UI自动化:Cline 使用Playwright MCP Server完成测试
大模型的UI自动化:Cline 使用Playwright MCP Server完成测试 MCP MCP(Model Context Protocol),是一个开发的协议,标准化了应用程序如何为大模型提供上下文。MCP提供了一个标准的为LLM提供数据、工具的方式,使用MCP会更容易的构建Agent或者是基于LLM的复杂工作流。 最近…...
碰撞检测 | 图解凸多边形分离轴定理(附ROS C++可视化)
目录 0 专栏介绍1 凸多边形碰撞检测2 多边形判凸算法3 分离轴定理(SAT)4 算法仿真与可视化4.1 核心算法4.2 仿真实验 0 专栏介绍 🔥课设、毕设、创新竞赛必备!🔥本专栏涉及更高阶的运动规划算法轨迹优化实战,包括:曲线…...
Python 基本数据类型
目录 1. 字符串(String) 2. 列表(List) 3. 字典(Dictionary) 4. 集合(Set) 5. 数字(Number) 6. 布尔值(Boolean) 1. 字符串&…...
突破“第一崇拜“:五维心理重构之路
一、视频介绍 在这个崇尚"第一"的时代,我们如何找到自己的独特价值?本视频将带您踏上五维心理重构之旅,从诗意人生的角度探讨如何突破"圣人之下皆蝼蚁"的局限。我们将穿越人生的不同阶段,从青春的意气风发到…...
KubeKey一键安装部署k8s集群和KubeSphere详细教程
目录 一、KubeKey简介 二、k8s集群KubeSphere安装 集群规划 硬件要求 Kubernetes支持版本 操作系统要求 SSH免密登录 配置集群时钟 所有节点安装依赖 安装docker DNS要求 存储要求 下载 KubeKey 验证KubeKey 配置集群文件 安装集群 验证命令 登录页面 一、Ku…...
UE5网络通信架构解析
文章目录 前言一、客户端-服务器架构(C/S Model)二、对等网络架构(P2P,非原生支持)三、混合架构(自定义扩展)四、UE5网络核心机制 前言 UE5的网络通信主要基于客户端-服务器(C/S&am…...
实验3 知识表示与推理
实验3 知识表示与推理 一、实验目的 (1)掌握知识和知识表示的基本概念,理解其在AI中的深刻含义与意义; (2)熟悉AI中常用的知识表示方法的优缺点及其应用场景; (3)掌握产…...
基于Springboot银行信用卡额度管理系统【附源码】
基于Springboot银行信用卡额度管理系统 效果如下: 系统登陆页面 用户个人中心页面 新增信用卡申请页面 评估审核页面 管理员主页面 评估审核页面 操作日志管理页面 消费页面 研究背景 随着金融行业的快速发展和信息技术的不断进步,信用卡作为一种便捷…...
达梦数据库学习笔记@1
目录 达梦数据库学习笔记一、表空间管理(一)默认表空间(二)相关数据字典(三)表空间操作(四)临时表空间管理 二、重做日志管理(一)系统视图(二&…...
图像处理篇---图像处理中常见参数
文章目录 前言一、分贝(dB)的原理1.公式 二、峰值信噪比(PSNR, Peak Signal-to-Noise Ratio)1.用途2.公式3.示例 三、信噪比(SNR, Signal-to-Noise Ratio)1.用途2.公式3.示例 四、动态范围(Dyna…...
AI Agent实战:打造京东广告主的超级助手 | 京东零售技术实践
前言 自2022年末ChatGPT的问世,大语言模型(LLM)技术引发全球关注。在大模型技术落地的最佳实践中,智能体(Agent)架构显现出巨大潜力,成为业界的普遍共识,各大公司也纷纷启动Agent技…...
50周学习go语言:第1周 环境搭建
以下是为零基础学习者准备的详细第1周教程,包含环境搭建、工具配置和首个Go程序的完整操作指南: 一、Go语言环境安装(Windows/macOS/Linux通用) 1. 下载安装包 官网地址:https://go.dev/dl//根据系统选择对应版本&am…...
4. MySQL 逻辑架构说明
4. MySQL 逻辑架构说明 文章目录 4. MySQL 逻辑架构说明1. 逻辑架构剖析1.1 服务器处理客户端请求1.2 Connectors(连接器)1.3 第1层:连接层1.4 第2层:服务层1.5 第3层:引擎层1.6 存储层 2. SQL执行流程2.1 MySQL 中的 SQL 执行流程 2.2 MySQL…...
《AI与NLP:开启元宇宙社交互动新纪元》
在科技飞速发展的当下,元宇宙正从概念逐步走向现实,成为人们关注的焦点。而在元宇宙诸多令人瞩目的特性中,社交互动体验是其核心魅力之一。人工智能(AI)与自然语言处理(NLP)技术的迅猛发展&…...
LeetCodeHot100 2. 两数相加 思路JavaScript版本代码
题目思路以题目提供的例子为例来进行思考分别将两个数倒过来计算,类似如图,结合链表其实非常方便。创建一个新的虚拟链表newlist存储计算结果,tail指向该链表的末尾。首先计算l1和l2的首位,25 7,更新newlist的tail的值为7&#x…...
Vue v-slot → 用 VuReact 转换后变成这样的 React 代码
VuReact 是一个能将 Vue 3 代码编译为标准、可维护 React 代码的工具。今天就带大家直击核心:Vue 中常见的 v-slot 指令经过 VuReact 编译后会变成什么样的 React 代码? 前置约定 为避免示例代码冗余导致理解偏差,先明确两个小约定…...
蓝牙低功耗基-蓝牙广播
概述 广告功能是任何蓝牙LE连接中的一个关键要素。对不同的广告参数、其含义以及如何通过调整这些参数来实现应用目标(无论是降低功耗、提高可靠性还是加快设备发现过程)建立基本的理解是十分重要的。 蓝牙LE中的广告功能主要用于两个主要目的。一是向邻近设备广播数据&#…...
【代码】基于交替方向乘子法(admm)的微电网分布式低碳优化运行策略matlab-yalmip-cplex/gurobi
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…...
别再为SURF/SIFT发愁了!Ubuntu 20.04下OpenCV_contrib离线安装全攻略(含预编译模型包)
Ubuntu 20.04下OpenCV_contrib离线安装终极指南:预编译模型包与避坑手册 在计算机视觉开发中,SURF、SIFT等经典特征提取算法依然是许多项目的基石。然而,当你在Ubuntu 20.04上尝试安装OpenCV_contrib扩展库时,可能会遇到各种网络下…...
Logisim搭建16位比较器翻车实录:从四个4位模块到最终调试成功的避坑指南
Logisim搭建16位比较器翻车实录:从四个4位模块到最终调试成功的避坑指南 当你信心满满地将四个4位比较器模块拼接成16位版本时,电路图上那些010状态码突然变得像摩尔斯电码一样难以破译。这不是简单的拼积木游戏——每个中间状态都暗藏玄机,高…...
明日方舟游戏资源库:从数据解包到创意实现的完整技术指南
明日方舟游戏资源库:从数据解包到创意实现的完整技术指南 【免费下载链接】ArknightsGameResource 明日方舟客户端素材 项目地址: https://gitcode.com/gh_mirrors/ar/ArknightsGameResource 在数字内容创作领域,获取高质量游戏素材往往面临版权、…...
TPA626芯片资料(1)
一、芯片介绍1. 概述TPA626是3PEAK(思瑞浦)生产的一款双向电流和功率监测器芯片,用于精确测量电流、电压和功耗,广泛应用于电源管理、服务器和电信设备等领域。TPA626是一款电流与功率监测器,具备I2C或SMBUS兼容接口。…...
深入K8s网络:当Nginx遇到CoreDNS,一次搞懂Service发现与Headless Service的实战选择
深入K8s网络:当Nginx遇到CoreDNS,一次搞懂Service发现与Headless Service的实战选择 在Kubernetes集群中,服务发现机制如同城市的地下管网——虽然看不见,却决定了整个系统的连通性。当Nginx作为入口网关需要动态解析后端服务&…...
保姆级教程:在UniApp Vue3项目中集成live-pusher,打造动态背景的趣味人脸活体检测
UniApp Vue3实战:用live-pusher打造沉浸式人脸活体检测体验 移动应用开发中,人脸活体检测已成为身份验证的核心环节。传统实现往往只关注功能实现,忽略了用户体验。本文将带你用UniApp和Vue3构建一个动态背景动作引导的趣味检测系统ÿ…...
