Flask-SQLAlchemy 단일 테이블에서 모든 행을 삭제하는 방법


97

Flask-SQLAlchemy를 사용하여 단일 테이블의 모든 행을 삭제하려면 어떻게해야합니까?

다음과 같은 것을 찾고 있습니다.

>>> users = models.User.query.all()
>>> models.db.session.delete(users)

# but it errs out: UnmappedInstanceError: Class '__builtin__.list' is not mapped

답변:


137

시도해보십시오 delete:

models.User.query.delete()

에서 워드 프로세서 :Returns the number of rows deleted, excluding any cascades.


2
흠, 이것은 나를 위해 일했지만 다음과 같이 변경 한 후에야 :models.User.query().delete()
killthrush

1
다음과 같은 쿼리를 사용하면 작동하지 않습니다.Model.query.filter(Model.some_id == some_id, Model.other_id.in_(other_ids).delete()
swade

5
삭제 후 커밋하는 것을 잊지 마십시오.
Kevin

3
사용하는 경우 'BaseQuery'객체가 호출 불가능 하므로 객체로 Flask-SQLAlchemy시도하십시오 . 테스트 및 검증되었습니다. User.query.delete()query
Shirish Kadam

99

DazWorrall의 대답은 정확합니다. 다음은 코드가 OP와 다르게 구조화 된 경우 유용 할 수있는 변형입니다.

num_rows_deleted = db.session.query(Model).delete()

또한 다음 스 니펫에서와 같이 커밋 할 때까지 삭제가 적용되지 않는다는 것을 잊지 마십시오.

try:
    num_rows_deleted = db.session.query(Model).delete()
    db.session.commit()
except:
    db.session.rollback()

50

플라스크 -Sqlalchemy

모든 기록 삭제

#for all records
db.session.query(Model).delete()
db.session.commit()

단일 행 삭제

여기서 DB는 개체 Flask-SQLAlchemy 클래스입니다. 모든 레코드를 삭제하고 특정 레코드를 삭제하려면 filter쿼리에서 절 을 시도 하십시오. 전의.

#for specific value
db.session.query(Model).filter(Model.id==123).delete()
db.session.commit()

개체 별 단일 레코드 삭제

record_obj = db.session.query(Model).filter(Model.id==123).first()
db.session.delete(record_obj)
db.session.commit()

https://flask-sqlalchemy.palletsprojects.com/en/2.x/queries/#deleting-records


1
저도 비슷한 상황에 처해 있습니다. 현재 테이블에 ID 1부터 4까지 4 개의 레코드가 있다고 가정 해 보겠습니다. db.session.query (Table_name) .delete () db.session.commit ()을 수행하고 db.session을 수행하면 .add ()를 다시 눌러 새 레코드를 추가하면 다음 레코드의 ID는 5가됩니다. 이제 테이블이 비어 있으므로 새 레코드가 이제 다시 1부터 시작하는 ID를 얻길 원합니다. 어떻게 할 수 있습니까?
qre0ct

이 링크를 참조하시기 바랍니다 stackoverflow.com/questions/23038422/...
아난드 Tripathi에게
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.