【问题标题】:SQLAlchemy DELETE: a foreign key contraint failsSQLAlchemy DELETE:外键约束失败
【发布时间】:2021-12-04 15:17:03
【问题描述】:

我有以下两张表:

class User(Base):
    __tablename__ = "user_entity"

    id = Column(String(32), primary_key=True, index=True)
    email = Column(String(32))
    email_constraint = Column(String(32))
    email_verified = Column(Boolean)
    enabled = Column(Boolean)
    federation_link = Column(String(32))
    first_name = Column(String(32))
    last_name = Column(String(32))
    realm_id = Column(String(32))
    username = Column(String(32))
    created_timestamp = Column(String(32))
    service_account_client_link = Column(String(32))
    not_before = Column(Integer)
    children = relationship("Userattribute", back_populates="parent")

class Userattribute(Base):
    __tablename__ = "user_attribute"

    name = Column(String(32))
    value = Column(String(32))
    id = Column(String(32), primary_key=True, index=True)
    user_id = Column(String(32), ForeignKey('user_entity.id', ondelete="CASCADE"))
    parent = relationship("User", back_populates="children")

我想通过他的 ID 从user_entity 表中删除一个用户:

[SQL: DELETE FROM user_entity WHERE user_entity.id = %s]

删除实现:

def delete_user(db: Session, id: str):
    return db.query(models.User).filter_by(id=id)

@app.delete("/entity/{id}", response_model=schemas.Userentity)
def del_user(id: str, db: Session = Depends(get_db)):
    user = crud.delete_user(db, id=id)
    user_obj = user.first()
    if user_obj is not None:
        user.delete()
        db.commit()
        return JSONResponse(content={"message": "user erfolgreich gelöscht"})
    else:
        raise HTTPException(status_code=400, detail=f"ID existiert nicht")

不幸的是,我收到以下错误:

 'Cannot delete or update a parent row: a foreign key constraint fails

为什么会失败?预期的行为是,当我删除用户时,user_attribute 表中的所有 user_attributes 也会被删除。如何解决?

【问题讨论】:

    标签: sql sqlalchemy


    【解决方案1】:

    我无法准确重现您的错误:user.delete() 引发 AttributeError。我想正确的电话应该是db.delete(user)


    删除行为也必须在父节点上的关系中指定:

    children = relationship(
                    "Userattribute",
                    back_populates="parent",
                    cascade="all, delete"
    )
    

    为了提高效率,您可能还想指定passive_deletes=True

    Using foreign key ON DELETE cascade with ORM relationships

    【讨论】:

    • 谢谢,但由于我使用的是 Keycloak 数据库,我想我的问题比我写的要多:-/
    • 这就是为什么我们希望您提供minimal reproducible example
    • 我知道,但是那个数据库设置有我不知道的规范,然后我问了这个问题。
    猜你喜欢
    • 2013-05-29
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 2013-03-04
    • 2016-08-17
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多