1

According to the documentation, there should be a delete() method (https://docs.sqlalchemy.org/en/13/core/tutorial.html#deletes), but my model does not seem to have a delete() method, what am I doing wrong?

Models.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)

Main.py

    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

The error message when i try to run the method:

AttributeError: type object 'Category' has no attribute 'delete'

Michael Knoth
  • 58
  • 1
  • 2
  • 10
  • 2
    https://docs.sqlalchemy.org/en/13/core/tutorial.html#deletes Their examples are objects generated from the class sqlalchemy.Table. You are using a different class so you are looking at the wrong side documentation or are implementing it in a different way which does not have `.delete()`. – Tin Nguyen Sep 22 '20 at 12:44
  • Is it `models.Category.__table__.delete().where(...)`, per https://stackoverflow.com/a/39774354/683329 ? – Jiří Baum Sep 22 '20 at 12:47
  • When using the ORM, you delete via the session: `session.delete(model_instance)`. – snakecharmerb Sep 22 '20 at 13:28

1 Answers1

1

Thanks for your answers, i found the error and fix it, i change the way how i create the Model. I used the "Classical Mappings" from the Documentation and now Deleting works :)

Models.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)

main.py

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}
Michael Knoth
  • 58
  • 1
  • 2
  • 10