Flask-SQLAlchemy cómo eliminar todas las filas en una sola tabla


98

¿Cómo elimino todas las filas en una sola tabla usando Flask-SQLAlchemy?

Buscando algo como esto:

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

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

Respuestas:


136

Prueba delete:

models.User.query.delete()

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


2
Hmm, esto funcionó para mí, pero solo después de cambiarlo a algo como esto:models.User.query().delete()
killthrush

1
No funciona si usa una consulta como esta:Model.query.filter(Model.some_id == some_id, Model.other_id.in_(other_ids).delete()
swade

6
No olvide comprometerse después de eliminar.
Kevin

3
Si está utilizando Flask-SQLAlchemy, intente User.query.delete()como queryobjeto ya que el objeto 'BaseQuery' no es invocable. Probado y verificado.
Shirish Kadam

102

La respuesta de DazWorrall es acertada. Aquí hay una variación que podría ser útil si su código está estructurado de manera diferente a los OP:

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

Además, no olvide que la eliminación no surtirá efecto hasta que se comprometa, como en este fragmento:

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

50

Frasco-Sqlalchemy

Eliminar todos los registros

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

Fila única eliminada

aquí DB es el objeto clase Flask-SQLAlchemy. Eliminará todos los registros y, si desea eliminar registros específicos, intente la filtercláusula en la consulta. ex.

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

Eliminar 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
Estoy en una situación similar. Digamos que hay 4 registros en la tabla a partir de ahora, de id 1 a 4. Cuando hago un db.session.query (Table_name) .delete () db.session.commit () y luego si hago un db.session .add () nuevamente para agregar nuevos registros, el siguiente registro obtiene una identificación de 5. Dado que mi tabla ahora está vacía, quiero que mis nuevos registros obtengan ahora una identificación comenzando desde 1 nuevamente. Cómo puedo hacer esto ?
qre0ct

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.