【问题标题】:Fastapi delete only one record in many to many tableFastapi 只删除多对多表中的一条记录
【发布时间】:2023-02-07 18:14:56
【问题描述】:

我正在构建一个使用 SQLAlchemy 的 Fastapi 应用程序,并且我正在尝试实现多对多关系。我的问题是当我尝试删除中间表中的记录时,它会删除所有记录。 表“device_protocol”的示例

device_id protocol_id status_id
1 1 1
1 2 1
1 3 3

如果我尝试仅删除 device_id=1 和 protocol_id=2 它实际上会删除所有 device_id=1 的记录

楷模:

class DeviceProtocolAssociation(Base):
    __tablename__ = "device_protocol"
    device_id = Column(Integer, ForeignKey("device.id", ondelete="CASCADE"), primary_key=True)
    device = relationship("Device", back_populates="device_protocols")
    protocol_id = Column(Integer, ForeignKey("protocol.id"), primary_key=True)
    protocol = relationship("Protocol", back_populates="device_protocols")
    status_id = Column(Integer, ForeignKey("status.id"), nullable=True)
    status = relationship("Status", back_populates="device_protocols")

class Device(Base):
    __tablename__ = "device"
    id = Column(Integer, primary_key=True, unique=True, index=True)
    name = Column(String(255))
    status_id = Column(Integer, ForeignKey('status.id'))
    status = relationship("Status", back_populates="devices")
    device_protocols = relationship(DeviceProtocolAssociation, back_populates="device")
    protocols = association_proxy("device_protocols", "protocols")

class Protocol(Base):
    __tablename__ = "protocol"
    id = Column(Integer, primary_key=True, unique=True, index=True)
    name = Column(String(255))
    device_protocols = relationship(DeviceProtocolAssociation, back_populates="protocol")
    devices = association_proxy("device_protocols", "devices")

class Status(Base):
    __tablename__ = "status"
    id = Column(Integer, primary_key=True, unique=True, index=True)
    name = Column(String(255))
    description = Column(String(255), nullable=True)
    devices = relationship("Device", back_populates="status")
    device_protocols = relationship(DeviceProtocolAssociation, back_populates="status")

路由器:

@router.delete('/{device_id}/{protocol_id}')
async def delete_status(device_id: int, protocol_id: int, db:Session=Depends(get_db)):
    relation_query = db.query(DeviceProtocolAssociation).filter(DeviceProtocolAssociation.device_id==device_id and DeviceProtocolAssociation.protocol== protocol_id)
    db_relation = relation_query.first()
    if not db_relation:
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND,
                            detail=f'No relation with this id: {id} found')
    relation_query.delete(db_relation)
    db.commit()
    return {"relation": "deleted"}

如何只删除一条记录?

【问题讨论】:

    标签: sqlalchemy fastapi pydantic


    【解决方案1】:

    在 SQLAlchemy 中过滤时不能使用 python 的 and。您可以将几个条件传递给filter

    relation_query = db.query(DeviceProtocolAssociation).filter(
        DeviceProtocolAssociation.device_id == device_id,
        DeviceProtocolAssociation.protocol == protocol_id,
    )
    

    或者使用二进制和运算符&

    relation_query = db.query(DeviceProtocolAssociation).filter(
        (DeviceProtocolAssociation.device_id == device_id)
        & (DeviceProtocolAssociation.protocol == protocol_id)
    )
    

    【讨论】:

    • 谢谢你给我指路。
    【解决方案2】:

    我的问题的解决方案是:

    relation_query = db.query(DeviceProtocolAssociation).filter(DeviceProtocolAssociation.device_id==device_id, DeviceProtocolAssociation.protocol_id==protocol_id)
    

    【讨论】:

      【解决方案3】:

      非常感谢您的解释;这绝对对我有很大帮助。继续分享这类知识。

      【讨论】:

      • 这不是问题的答案,请删除它。
      猜你喜欢
      • 2013-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-10
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      相关资源
      最近更新 更多