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
SeanPlusPlus
fuente

Respuestas:

136

Prueba delete:

models.User.query.delete()

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

DazWorrall
fuente
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()
Steve Saporta
fuente
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

Anand Tripathi
fuente
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
Consulte este enlace stackoverflow.com/questions/23038422/…
Anand Tripathi