首页 > 编程问答 >无法在 Fast api 中使用 SQLAlchemy 删除子表

无法在 Fast api 中使用 SQLAlchemy 删除子表

时间:2024-07-27 14:17:01浏览次数:8  
标签:python postgresql sqlalchemy fastapi fastapiusers

下面我有三个表,它们之间有多对多的关系,问题是我无法删除数据库中的用户表: “表 imagesmetadata 上的约束 imagesmetadata_user_id_fkey 取决于表用户 表令牌上的约束 tokens_user_id_fkey 取决于表 usercannot 删除表用户,因为其他对象依赖于它”

删除令牌和图像元数据表后删除用户表的唯一方法|| |虽然我已经把这个

放在我的代码中,但它仍然不起作用,有人可以帮忙吗? cascade="all, delete-orphan" 这是我的模型代码:

用户文件:

ImagesMetadata 文件:


from config.Database import Base
from sqlalchemy import Column, Boolean, String, ForeignKey, DateTime, func, BigInteger
from sqlalchemy.orm import relationship
from model import ImagesMetaData

class User(Base):
    __tablename__ = "users"

    id = Column(String, primary_key=True, index=True)
    email = Column(String, unique=True, index=True, nullable=False)
    name = Column(String, nullable=False)
    email_verified = Column(Boolean, nullable=False, default=False)
    picture = Column(String, default=None)
    created_at = Column(DateTime, server_default=func.now())
    tokens = relationship("Token", back_populates="user", cascade="all, delete-orphan")
    images = relationship("ImagesMetaData", back_populates="owner", cascade="all, delete-orphan")

class Token(Base):
    __tablename__ = 'tokens'

    id = Column(BigInteger, primary_key=True, autoincrement=True)
    access_token = Column(String, nullable=False)
    refresh_token = Column(String, nullable=False)
    expires_at = Column(DateTime, nullable=False)
    user_id = Column(String, ForeignKey('users.id', ondelete='CASCADE'), nullable=False)
    user = relationship("User", back_populates="tokens")
    created_at = Column(DateTime, server_default=func.now())
    updated_at = Column(DateTime, default=None)

ImagesMetadata file :

from sqlalchemy import Column, BigInteger, ForeignKey, String, DateTime, func
from sqlalchemy.orm import relationship
from config.Database import Base
from model import User

class ImagesMetaData(Base):
    __tablename__ = "imagesmetadata"
    id = Column(BigInteger, primary_key=True, autoincrement=True, nullable=False)
    name = Column(String(200), nullable=False)
    file_type = Column(String(10), nullable=False)
    upload_at = Column(DateTime, server_default=func.now())
    Bucket_folder = Column(String, nullable=False)
    user_id = Column(String, ForeignKey("users.id", ondelete="CASCADE"), nullable=False)
    
    # Relationship back to User
    owner = relationship("User", back_populates="images")

错误提示表明,在数据库中定义了外键约束,这些约束阻止在相关记录仍然存在于 imagesmetadata tokens 表中的情况下删除 users 表中的记录。 已经通过在模型中包含 cascade="all, delete-orphan" 来解决此问题,但是 SQLAlchemy 中的外键级联选项的实现方式略有不同。

以下是解决此问题并让代码按预期工作的步骤:

  1. 在关系定义中配置 cascade 选项: 确保在 User 模型中定义与 Token ImagesMetaData 的关系时,正确配置了 cascade 选项。 cascade="all, delete-orphan" 选项应应用于 User 模型中的关系,因为它拥有级联删除操作。

```python class User(Base): # ... other columns ...

   tokens = relationship("Token", back_populates="user", cascade="all, delete-orphan")
   images = relationship("ImagesMetaData", back_populates="owner", cascade="all, delete-orphan")

```

  1. 在数据库中配置 ondelete 选项:

虽然在 Token ImagesMetaData 模型中设置了 ondelete='CASCADE' ,但最好在数据库级别也设置它以确保一致性。当其引用的 User 记录被删除时,这将自动级联删除相关记录。

```python class Token(Base): # ... other columns ...

   user_id = Column(String, ForeignKey('users.id', ondelete='CASCADE'), nullable=False)

class ImagesMetaData(Base): # ... other columns ...

   user_id = Column(String, ForeignKey("users.id", ondelete='CASCADE'), nullable=False)

```

  1. 提交更改并测试: 保存对模型所做的更改,然后使用 SQLAlchemy 的 session.delete() 方法删除 User 记录。 cascade 选项应确保在删除 User 记录时自动删除相关 Token ImagesMetaData 记录。

以下是在 FastAPI 路由中实现此功能的示例:

from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session

from database import get_db
from models import User

router = APIRouter()

@router.delete("/users/{user_id}", status_code=204)
def delete_user(user_id: str, db: Session = Depends(get_db)):
    user = db.query(User).filter(User.id == user_id).first()

    if not user:
        raise HTTPException(status_code=404, detail="User not found")

    db.delete(user)
    db.commit()

通过这些更改,应该能够从数据库中删除 User 记录及其相关 Token ImagesMetaData 记录,而不会遇到任何外键约束错误。

标签:python,postgresql,sqlalchemy,fastapi,fastapiusers
From: 78800647

相关文章

  • 使用正则表达式删除Python中常见的公司名称后缀
    我正在努力删除一些公司名称中的后缀。预期结果如下:原始名称:AppleInc.SonyCorporationFiatChryslerAutomobilesS.p.A.SamsungElectronicsCo.,Ltd.清除名称:AppleSonyFiatChryslerAutomobilesSamsungElectronics到目前为止我所做的:importred......
  • 如何将 Brave 网络浏览器与 python、selenium 和 chromedriver 结合使用?
    我从Google的Chrome切换到Brave网络浏览器并且很难让它像Chrome一样与Brave一起使用。Brave是基于Chromium的,所以我猜它应该不会那么难。我确保我的Brave和Chromedriver处于相同版本,像这样,~/some/path$chromedriver--versionChromeDriver76.0.3......
  • 覆盖 python 应用程序时权限被拒绝
    我使用python制作了一个粗略的自动更新应用程序,并使用freeze-cx制作了exe文件。首先,该应用程序检查firebase服务器上是否有最新版本的文件可用,如果可用则下载zip文件。并且应用程序解压并覆盖文件。this_file_path=sys.executableifgetattr(sys,'frozen......
  • 如何使用aioprometheus和FastAPI向外部服务添加指标?
    我正在尝试在使用aioprometheus构建的应用程序中使用FastAPI向外部服务添加指标。这是我想要实现的目标的简化示例。假设我有一个这样的包装器App类:fromaioprometheusimportRegistry,Counter,HistogramfromfastapiimportFastAPIclassApp:......
  • Python数据分析案例55——基于LSTM结构自编码器的多变量时间序列异常值监测
    案例背景时间序列的异常值检测是方兴未艾的话题。比如很多单变量的,一条风速,一条用电量这种做时间序列异常值检测,想查看一下哪个时间点的用电量异常。多变量时间序列由不同变量随时间变化的序列组成,这些时间序列在实际应用中通常来自不同的传感器或数据源。多变量时间序列异......
  • 我没有 python 但我有 python3
    我最近格式化了我的笔记本电脑并安装了Ubuntu操作系统。我没有明确安装Python。为了检查它是否已预安装,我在终端中运行python--version并得到了这个:$python--versionCommand'python'notfound,butcanbeinstalledwith:sudoaptinstallpython3......
  • 基于YOLOv9的停车场空闲车位检测【python源码+UI界面+数据集+模型+语音报警+安装说明
    往期精品导航基于YOLOv9的脑肿瘤区域检测智慧课堂基于YOLOv8的学生上课行为检测基于YOLOv9+pyside的安检仪x光危险物物品检测(有ui)基于YOLOv9的PCB板缺陷检测基于YOLOv9的线路绝缘子缺陷检测【python源码+UI界面+数据集+模型+语音报警+安装说明】基于YOLOv9的道路状况检测【......
  • 1-python的数据类型与变量
    一、交互模式与脚本模式交互模式:就相当于一种问答模式,关闭即消失无法保存重用比如python自带的编译器脚本模式:可以将代码长期保存以及重复使用如何创建脚本模式:idle——file——newfile[快捷方式:idle——ctrl+n]保存:ctrl+s运行:F5二、变量(Variable)变量:会变化......
  • 2-Python数据类型——序列
    Python数据类型——序列一、序列序列是一个可以存放多个值的容器。有序序列:在序列中每个值都有对应的下标下标:就相当于酒店的房间号,方便客人的查找与酒店的管理在编程中下标的起始值与日常生活中的计数有所不同:下标的计数从0开始计数,从左往右计数:下标从0开始往右递......
  • crontab 运行 .sh 文件调用 python 脚本
    我有一个pythonselenium脚本,可以打开chrome并为我运行一些自动化任务。在crontab中直接调用python可以使用下面的行。:10.0是我运行echo$DISPLAY时得到的值。我使用的是Ubuntu22.04.4LTS5823**2DISPLAY=:10.0/usr/bin/python3/home/user/Script......