首页 > 解决方案 > 无法使用 delete() 从数据库中删除对象

问题描述

根据文档,应该有一个 delete() 方法(https://docs.sqlalchemy.org/en/13/core/tutorial.html#deletes),但我的模型似乎没有 delete() 方法, 我究竟做错了什么?

模型.py

from sqlalchemy import BigInteger, Column, DateTime, ForeignKey, Integer, Numeric, String, Text, text
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
metadata = Base.metadata


class Category(Base):
    __tablename__ = 'category'
    id = Column('id', Integer, primary_key=True)
    name = Column('name', String(200))
    parentid = Column('parentid', Integer)

主文件

    def crud_delete_single_cat(db: Session, cat_id: int) -> int:
        query = models.Category.delete().where(models.Category.id == cat_id)
        print(query)
        results = db.query()
        return results.rowcount

我尝试运行该方法时的错误消息:

AttributeError:类型对象“类别”没有属性“删除”

标签: pythonsqlalchemyfastapi

解决方案


感谢您的回答,我发现了错误并修复了它,我改变了创建模型的方式。我使用了文档中的“经典映射”,现在正在删除作品:)

模型.py

from sqlalchemy import BigInteger, Column, DateTime, ForeignKey, Integer, Numeric, String, Text, text, Table
from sqlalchemy.orm import relationship, mapper
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
metadata = Base.metadata

category = Table('category', metadata,
                 Column('id', Integer, primary_key=True),
                 Column('name', String(200)),
                 Column('parentid', Integer),
                 )


class Category(object):
    def __init__(self, cat_id, name, parentid):
        self.id = cat_id
        self.name = name
        self.parentid = parentid


mapper(Category, category)

主文件

def crud_delete_single_cat(db: Session, cat_id: int) -> bool:
    # records = db.query(models.Category).all()

    stm = models.category.delete().where(models.category.c.id == cat_id)
    print(stm)
    results = db.execute(stm)
    db.commit()
    # result_set = db.execute("SELECT id, name, parentid FROM public.category;")
    # rint(type(result_set))
    # for r in result_set:
    #    print(r)
    # return [{column: value for column, value in rowproxy.items()} for rowproxy in result_set]
    # return await databasehelper.database.fetch_all(query)
    return True


@router.delete("/category/{cat_id}", tags=["category"])
def read_item(cat_id: int, db: Session = Depends(get_db)):
    deleted = crud_delete_single_cat(db, cat_id)
    return {"cat_deleted": deleted}

推荐阅读