当前位置: 首页 > news >正文

取消票证会把指定的票证从数据库中删除,同时也会把票证和航班 等相关表中的关联关系一起删除。但在删除之前,它会先检查当前用户是否拥有这张票

在做航班智能客服问答系统时会遇到取消票证的场景,这里涉及数据库的操作时会把指定的票证从数据库中删除,同时也会把票证和航班等相关表中的关联关系一起删除。但在删除之前,需要先检查当前用户是否拥有这张票,只有票主才有权限取消这张票。

下面用 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()

代码逐行解释:

  1. 定义函数 cancel_ticket(current_user_id, ticket_id)
    接受当前用户的 ID 和要取消的票证 ID 作为参数。

  2. 查询票证:

    ticket = db.session.query(Ticket).filter_by(id=ticket_id).first()
    

    这行代码从数据库中查找票证表(Ticket)中与 ticket_id 匹配的记录。

  3. 检查票证是否存在:

    if ticket is None:raise Exception("票证不存在!")
    

    如果没有找到票证,就抛出异常,提醒票证不存在。

  4. 验证当前用户是否拥有这张票:

    if ticket.user_id != current_user_id:raise Exception("您没有权限取消这张票!")
    

    这行代码确保票证的所有者(ticket.user_id)和当前用户的 ID 一致,只有票主才可以取消。

  5. 删除票证与航班等关联的数据:

    related_flights = db.session.query(Flight).filter_by(ticket_id=ticket_id).all()
    for flight in related_flights:db.session.delete(flight)
    

    这里假设票证和航班表(Flight)有外键关联。首先查询所有与这张票有关联的航班记录,然后逐个删除它们。

  6. 删除票证本身:

    db.session.delete(ticket)
    

    将票证从数据库中删除。

    这里的db.session.delete是什么意思

  7. 提交事务:

    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 划分字母区间

思路 先统计字符串中每一个字母出现的最后下标&#xff0c;然后从end初始化为第一个字母出现的最后下标&#xff0c;在i<end时&#xff0c;不断更新end&#xff0c;因为一旦囊括新的字母就最起码要遍历到新字母出现的最后下标&#xff0c;在i>end时&#xff0c;说明遍历…...

【Redis 原理】网络模型

文章目录 用户空间 && 内核空间阻塞IO非阻塞IO信号驱动IO异步IOIO多路复用selectpollepoll Web服务流程Redis 网络模型Redis单线程网络模型的整个流程Redis多线程网络模型的整个流程 用户空间 && 内核空间 为了避免用户应用导致冲突甚至内核崩溃&#xff0c;用…...

cpp中的继承

一、继承概念 在cpp中&#xff0c;封装、继承、多态是面向对象的三大特性。这里的继承就是允许已经存在的类&#xff08;也就是基类&#xff09;的基础上创建新类&#xff08;派生类或者子类&#xff09;&#xff0c;从而实现代码的复用。 如上图所示&#xff0c;Person是基类&…...

DeepSeek全栈接入指南:从零到生产环境的深度实践

第一章:DeepSeek技术体系全景解析 1.1 认知DeepSeek技术生态 DeepSeek作为新一代人工智能技术平台,构建了覆盖算法开发、模型训练、服务部署的全链路技术栈。其核心能力体现在: 1.1.1 多模态智能引擎 自然语言处理:支持文本生成(NLG)、语义理解(NLU)、情感分析等计算…...

CSS 真的会阻塞文档解析吗?

在网页开发领域&#xff0c;一个常见的疑问是 CSS 是否会阻塞文档解析。理解这一问题对于优化网页性能、提升用户体验至关重要。要深入解答这个问题&#xff0c;需要从浏览器渲染网页的原理说起。 浏览器渲染网页的基本流程 浏览器在接收到 HTML 文档后&#xff0c;会依次进行…...

大模型的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 专栏介绍 &#x1f525;课设、毕设、创新竞赛必备&#xff01;&#x1f525;本专栏涉及更高阶的运动规划算法轨迹优化实战&#xff0c;包括&#xff1a;曲线…...

Python 基本数据类型

目录 1. 字符串&#xff08;String&#xff09; 2. 列表&#xff08;List&#xff09; 3. 字典&#xff08;Dictionary&#xff09; 4. 集合&#xff08;Set&#xff09; 5. 数字&#xff08;Number&#xff09; 6. 布尔值&#xff08;Boolean&#xff09; 1. 字符串&…...

突破“第一崇拜“:五维心理重构之路

一、视频介绍 在这个崇尚"第一"的时代&#xff0c;我们如何找到自己的独特价值&#xff1f;本视频将带您踏上五维心理重构之旅&#xff0c;从诗意人生的角度探讨如何突破"圣人之下皆蝼蚁"的局限。我们将穿越人生的不同阶段&#xff0c;从青春的意气风发到…...

KubeKey一键安装部署k8s集群和KubeSphere详细教程

目录 一、KubeKey简介 二、k8s集群KubeSphere安装 集群规划 硬件要求 Kubernetes支持版本 操作系统要求 SSH免密登录 配置集群时钟 所有节点安装依赖 安装docker DNS要求 存储要求 下载 KubeKey 验证KubeKey 配置集群文件 安装集群 验证命令 登录页面 一、Ku…...

UE5网络通信架构解析

文章目录 前言一、客户端-服务器架构&#xff08;C/S Model&#xff09;二、对等网络架构&#xff08;P2P&#xff0c;非原生支持&#xff09;三、混合架构&#xff08;自定义扩展&#xff09;四、UE5网络核心机制 前言 UE5的网络通信主要基于客户端-服务器&#xff08;C/S&am…...

实验3 知识表示与推理

实验3 知识表示与推理 一、实验目的 &#xff08;1&#xff09;掌握知识和知识表示的基本概念&#xff0c;理解其在AI中的深刻含义与意义&#xff1b; &#xff08;2&#xff09;熟悉AI中常用的知识表示方法的优缺点及其应用场景&#xff1b; &#xff08;3&#xff09;掌握产…...

基于Springboot银行信用卡额度管理系统【附源码】

基于Springboot银行信用卡额度管理系统 效果如下&#xff1a; 系统登陆页面 用户个人中心页面 新增信用卡申请页面 评估审核页面 管理员主页面 评估审核页面 操作日志管理页面 消费页面 研究背景 随着金融行业的快速发展和信息技术的不断进步&#xff0c;信用卡作为一种便捷…...

达梦数据库学习笔记@1

目录 达梦数据库学习笔记一、表空间管理&#xff08;一&#xff09;默认表空间&#xff08;二&#xff09;相关数据字典&#xff08;三&#xff09;表空间操作&#xff08;四&#xff09;临时表空间管理 二、重做日志管理&#xff08;一&#xff09;系统视图&#xff08;二&…...

图像处理篇---图像处理中常见参数

文章目录 前言一、分贝&#xff08;dB&#xff09;的原理1.公式 二、峰值信噪比&#xff08;PSNR, Peak Signal-to-Noise Ratio&#xff09;1.用途2.公式3.示例 三、信噪比&#xff08;SNR, Signal-to-Noise Ratio&#xff09;1.用途2.公式3.示例 四、动态范围&#xff08;Dyna…...

AI Agent实战:打造京东广告主的超级助手 | 京东零售技术实践

前言 自2022年末ChatGPT的问世&#xff0c;大语言模型&#xff08;LLM&#xff09;技术引发全球关注。在大模型技术落地的最佳实践中&#xff0c;智能体&#xff08;Agent&#xff09;架构显现出巨大潜力&#xff0c;成为业界的普遍共识&#xff0c;各大公司也纷纷启动Agent技…...

50周学习go语言:第1周 环境搭建

以下是为零基础学习者准备的详细第1周教程&#xff0c;包含环境搭建、工具配置和首个Go程序的完整操作指南&#xff1a; 一、Go语言环境安装&#xff08;Windows/macOS/Linux通用&#xff09; 1. 下载安装包 官网地址&#xff1a;https://go.dev/dl//根据系统选择对应版本&am…...

4. MySQL 逻辑架构说明

4. MySQL 逻辑架构说明 文章目录 4. MySQL 逻辑架构说明1. 逻辑架构剖析1.1 服务器处理客户端请求1.2 Connectors(连接器)1.3 第1层&#xff1a;连接层1.4 第2层&#xff1a;服务层1.5 第3层&#xff1a;引擎层1.6 存储层 2. SQL执行流程2.1 MySQL 中的 SQL 执行流程 2.2 MySQL…...

《AI与NLP:开启元宇宙社交互动新纪元》

在科技飞速发展的当下&#xff0c;元宇宙正从概念逐步走向现实&#xff0c;成为人们关注的焦点。而在元宇宙诸多令人瞩目的特性中&#xff0c;社交互动体验是其核心魅力之一。人工智能&#xff08;AI&#xff09;与自然语言处理&#xff08;NLP&#xff09;技术的迅猛发展&…...

2026市场岗位学数据分析的价值分析

一、2026年市场岗位中数据分析的重要性数据分析在市场岗位中的作用日益凸显&#xff0c;2026年预计将成为核心技能之一。随着数字化进程加速&#xff0c;市场决策越来越依赖数据驱动&#xff0c;掌握数据分析能力将显著提升职业竞争力。二、数据分析在市场岗位中的具体应用市场…...

LangChain学习笔记--Model I/O 模块部分 1.5 Prompt Template(提示词模板)

LangChain学习笔记–Model I&#xff0f;O 模块部分 1.5 Prompt Template&#xff08;提示词模板&#xff09; ‍ 介绍 ​Prompt Template​ 可以理解为一种“提示词模板”。来自langchain_core.prompts中 它的核心是&#xff1a;把固定的提示内容先写好&#xff0c;并预留几个…...

别再为SURF/SIFT发愁了!Ubuntu 20.04下OpenCV_contrib离线安装全攻略(含预编译模型包)

Ubuntu 20.04下OpenCV_contrib离线安装终极指南&#xff1a;预编译模型包与避坑手册 在计算机视觉开发中&#xff0c;SURF、SIFT等经典特征提取算法依然是许多项目的基石。然而&#xff0c;当你在Ubuntu 20.04上尝试安装OpenCV_contrib扩展库时&#xff0c;可能会遇到各种网络下…...

从仿真到芯片:基于UC3854的Boost PFC电路Saber仿真参数调试实战与TI文档解读

从仿真到芯片&#xff1a;基于UC3854的Boost PFC电路Saber仿真参数调试实战 在电力电子领域&#xff0c;功率因数校正&#xff08;PFC&#xff09;技术已成为现代电源设计的标配。Boost拓扑因其结构简单、效率高而成为PFC电路的首选方案。然而&#xff0c;从理论到实践&#xf…...

别再手动导数据了!用Kettle从API接口自动同步数据到MySQL的保姆级教程

别再手动导数据了&#xff01;用Kettle从API接口自动同步数据到MySQL的保姆级教程 每周五下午&#xff0c;销售部门的王经理总会准时出现在IT部门门口&#xff0c;手里拿着一份Excel表格&#xff1a;"小李&#xff0c;这是本周CRM系统的新增客户数据&#xff0c;麻烦导入到…...

Zynq Linux系统下XVC服务器配置全记录:从设备树修改到xvcServer.c编译运行

Zynq Linux系统下XVC服务器深度配置指南&#xff1a;从设备树到服务部署 在嵌入式系统开发中&#xff0c;调试工具的灵活性和可靠性直接影响开发效率。XVC&#xff08;Xilinx Virtual Cable&#xff09;作为一种基于TCP/IP协议的远程调试方案&#xff0c;为Zynq平台开发者提供了…...

别再踩坑了!Android 10+ 保存图片到相册的完整流程与权限处理(附完整代码)

Android 10 图片保存实战&#xff1a;避开Scoped Storage的12个深坑 每次看到同事在Android 10设备上调试图片保存功能时抓狂的样子&#xff0c;我都会想起自己曾经踩过的那些坑。从MediaStore的诡异行为到权限申请的玄学问题&#xff0c;这个看似简单的功能背后藏着太多"…...

AGI系统性偏差检测实战指南(工业级质量门禁清单V2.3)

第一章&#xff1a;AGI系统性偏差检测的理论基石与工业级质量门禁演进 2026奇点智能技术大会(https://ml-summit.org) AGI系统性偏差并非孤立的模型输出异常&#xff0c;而是多层级认知架构中语义表征、推理路径与价值对齐机制在训练数据分布偏移、目标函数隐式假设及部署环境…...

IDM永久激活终极指南:开源脚本安全冻结试用期的完整教程

IDM永久激活终极指南&#xff1a;开源脚本安全冻结试用期的完整教程 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 还在为IDM试用期到期而烦恼吗&#xff1f;ID…...

ESP32 OTA升级实战:从官方native_ota_example到自定义固件服务器的完整配置指南

ESP32 OTA升级实战&#xff1a;从官方示例到生产级部署的进阶指南 当你的ESP32设备部署在远程现场&#xff0c;每次更新固件都要派人去现场烧录&#xff1f;这种低效方式早已过时。OTA&#xff08;Over-The-Air&#xff09;技术让设备像智能手机一样远程更新&#xff0c;而ESP3…...