Flask-SQLAlchemy como excluir todas as linhas em uma única tabela


97

Como faço para excluir todas as linhas em uma única tabela usando Flask-SQLAlchemy?

Procurando por algo assim:

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

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

Respostas:


137

Experimente delete:

models.User.query.delete()

Dos documentos :Returns the number of rows deleted, excluding any cascades.


2
Hmm, isso funcionou para mim, mas só depois de mudar para algo assim:models.User.query().delete()
killthrush de

1
Não funciona se você usar uma consulta como esta:Model.query.filter(Model.some_id == some_id, Model.other_id.in_(other_ids).delete()
swade

5
Não se esqueça de confirmar após a exclusão.
Kevin

3
Se você estiver usando Flask-SQLAlchemy, tente User.query.delete()como queryobjeto, pois o objeto 'BaseQuery' não pode ser chamado. Testado e verificado.
Shirish Kadam

99

A resposta de DazWorrall está certa. Aqui está uma variação que pode ser útil se o seu código for estruturado de maneira diferente do OP:

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

Além disso, não se esqueça de que a exclusão não terá efeito até que você confirme, como neste snippet:

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

50

Flask-Sqlalchemy

Excluir todos os registros

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

Linha Única Excluída

aqui DB é o objeto da classe Flask-SQLAlchemy. Ele excluirá todos os registros dele e se você quiser excluir registros específicos, tente a filtercláusula na consulta. ex.

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

Excluir registro único por objeto

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
Estou em um tipo de situação semelhante. Digamos que haja 4 registros na tabela a partir de agora, de id 1 a 4. Quando eu faço um db.session.query (Table_name) .delete () db.session.commit () e então se eu faço um db.session .add () novamente para adicionar novos registros, o próximo registro obtém um id de 5. Como minha tabela agora está vazia, quero que meus novos registros recebam um id começando em 1 novamente. Como posso fazer isso ?
qre0ct

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.