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

news/2025/2/26 0:33:47

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

下面用 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 请点击查看更多介绍


http://www.niftyadmin.cn/n/5866996.html

相关文章

FastAPI系列:Ubuntu部署FastAPI项目实战

这篇文章提供了在Ubuntu上部署FastAPI应用程序的详细指南。首先,读者将学习如何创建项目目录并设置Python虚拟环境,接着安装FastAPI、Uvicorn和Gunicorn等必要依赖。随后,文章指导用户编写基本的FastAPI应用程序代码,并使用Gunico…

文字语音相互转换

目录 1.介绍 2.思路 3.安装python包 3.程序: 4.运行结果 1.介绍 当我们使用一些本地部署的语言模型的时候,往往只能进行文字对话,这一片博客教大家如何实现语音转文字和文字转语音,之后接入ollama的模型就能进行语音对话了。…

【LeetCodehHot100_0x01】

LeetCodeHot100_0x01 1. 两数之和 解题思路&#xff1a; 暴力枚举法、哈希法 【暴力枚举】 class Solution {public int[] twoSum(int[] nums, int target) {int n nums.length;for(int i0;i<n;i) {for(int ji1;j<n;j) {if(nums[i] nums[j] target) {return new in…

第9章:LangChain结构化输出-示例5(基于大模型如何精确匹配POJO的字段)

如何使用LangChain4j框架创建和使用多种AI服务。它通过定义接口和注解,将自然语言处理任务(如情感分析、数字提取、日期提取、POJO提取等)封装为服务,并通过LangChain4j的AiServices动态生成这些服务的实现。 本章主要讲述基于LangChain调用大模型如何进行结构化输出的真实…

Android之APP更新(通过接口更新)

文章目录 前言一、效果图二、实现步骤1.AndroidManifest权限申请2.activity实现3.有版本更新弹框UpdateappUtilDialog4.下载弹框DownloadAppUtils5.弹框背景图 总结 前言 对于做Android的朋友来说&#xff0c;APP更新功能再常见不过了&#xff0c;因为平台更新审核时间较长&am…

【数据库】【MySQL】索引

MySQL中索引的概念 索引&#xff08;MySQL中也叫做"键&#xff08;key&#xff09;"&#xff09;是一种数据结构&#xff0c;用于存储引擎快速定找到记录。 简单来说&#xff0c;它类似于书籍的目录&#xff0c;通过索引可以快速找到对应的数据行&#xff0c;而无需…

QT中日志的使用案例 || 自动创建、管理、保存QT日志数据

目录 1.quiwidget.cpp 2.widget.cpp 3.widget.h 4.在需要记录日志的地方直接将信息插入即可 1. 释放 m_fileLog 和 m_textStream 1.1 为什么要关闭和删除 m_fileLog 和 m_textStream&#xff1f; 1.2 如果不这样做会有什么坏处&#xff1f; 3. 总结 4.参考文章 需求分析…

整数二分算法

例题&#xff1a; 给定一个按照升序排列的长度为 n 的整数数组&#xff0c;以及 q个查询。 对于每个查询&#xff0c;返回一个元素 k 的起始位置和终止位置&#xff08;位置从 0开始计数&#xff09;。 如果数组中不存在该元素&#xff0c;则返回 -1 -1。 输入格式 第一行…