Cómo eliminar un registro por id en Flask-SQLAlchemy

3 minutos de lectura

avatar de usuario
sergey

tengo users tabla en mi base de datos MySql. Esta mesa tiene id, name y age campos.

¿Cómo puedo eliminar algún registro por id?

Ahora uso el siguiente código:

user = User.query.get(id)
db.session.delete(user)
db.session.commit()

Pero no quiero hacer ninguna consulta antes de la operación de eliminación. ¿Hay alguna manera de hacer esto? Lo sé, puedo usar db.engine.execute("delete from users where id=...")pero me gustaría usar delete() método.

avatar de usuario
adarsh

Puedes hacerlo,

User.query.filter_by(id=123).delete()

o

User.query.filter(User.id == 123).delete()

Asegurate que commit por delete() para tomar efecto.

  • asegúrate de poner db.session.commit() en el final. donde la base de datos: db = SQLAlchemy(app)

    – ben

    4 de octubre de 2016 a las 4:36


  • Advertencia: Tal delete no se conectará en cascada si confía en la conexión en cascada en python/ORM. Primero deberá consultar el objeto y luego eliminarlo.

    – nirvana-msu

    2 de febrero de 2018 a las 0:24

  • que pasaria si User no existe?

    – senaps

    14 de abril de 2019 a las 6:48

  • Los anteriores son sql directo DELETE declaraciones que no implican cargar un objeto en el orm antes de eliminarlo y @nirvana-msu es correcto en el sentido de que la base de datos no conoce las reglas en cascada establecidas en la relación a nivel de orm. Si, en cambio, puede configurarlos en las declaraciones de clave externa (es decir, en la relación de nivel de base de datos), la cascada funcionará bien (por ejemplo, Column('parent_id', ForeignKey('parents.id', ondelete='cascade'))).

    – Michael Ekoka

    16 oct 2020 a las 14:25

  • @senaps el método delete() devuelve la cantidad de elementos eliminados. Entonces, si User no existe, devuelve cero y no lanza ninguna excepción. Probé este comportamiento en Sqlalchemy v1.4.29 con una base de datos en memoria de SQLite.

    – cristianmtown

    27 de enero a las 14:08

avatar de usuario
Steve

Solo quiero compartir otra opción:

# mark two objects to be deleted
session.delete(obj1)
session.delete(obj2)

# commit (or flush)
session.commit()

http://docs.sqlalchemy.org/en/latest/orm/session_basics.html#deleting

En este ejemplo, los siguientes códigos funcionarán bien:

obj = User.query.filter_by(id=123).one()
session.delete(obj)
session.commit()

  • cuando está ejecutando un registro, esta opción es bastante buena porque le permite realizar la consulta y registrar algo de lo que su usuario ha considerado insignificante. de esa manera, puede mostrarles el registro cuando le pregunten por qué falta ese registro.

    – pitido_cheque

    2 de noviembre de 2021 a las 2:57

avatar de usuario
Logovski Dmitrii

Otra posible solución, especialmente si desea eliminar por lotes

deleted_objects = User.__table__.delete().where(User.id.in_([1, 2, 3]))
session.execute(deleted_objects)
session.commit()

  • esto es muy bueno porque a veces el nombre de usuario está vacío o tiene caracteres Unicode. borrar por ID es oro. spasibo 🙂

    – Vórtice

    18 de abril de 2021 a las 17:24

avatar de usuario
Abc Xyz

En sqlalchemy 1.4 (estilo 2.0) puedes hacerlo así:

from sqlalchemy import select, update, delete, values

sql1 = delete(User).where(User.id.in_([1, 2, 3]))
sql2 = delete(User).where(User.id == 1)

db.session.execute(sql1)
db.session.commit()

o

u = db.session.get(User, 1)
db.session.delete(u)
db.session.commit()

En mi opinión, usar seleccionar, actualizar, eliminar es más legible. Se puede encontrar una comparación de estilo 1.0 vs 2.0 aquí.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad