Jak usunąć rekord według identyfikatora w Flask-SQLAlchemy

128

Mam userstabelę w mojej bazie danych MySql. Ten stół ma id, namei agepola.

Jak mogę usunąć niektóre wpisy id?

Teraz używam następującego kodu:

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

Ale nie chcę wykonywać żadnego zapytania przed operacją usuwania. Czy jest na to sposób? Wiem, mogę użyć db.engine.execute("delete from users where id=..."), ale chciałbym użyć delete()metody.

Siergiej
źródło

Odpowiedzi:

206

Możesz to zrobić,

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

lub

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

Upewnij się, że commitdla delete()odniosły skutek.

adarsh
źródło
19
upewnij się, że włożyłeś db.session.commit()do końca. gdzie db: db = SQLAlchemy(app)
Ben
Czy możesz używać IN z tą metodą?
ram4nd
10
Ostrzeżenie: takie deletenie będą kaskadowe, jeśli polegasz na kaskadowaniu w Pythonie / ORM. Najpierw musisz wysłać zapytanie do obiektu, a następnie usunąć .
nirvana-msu
5
co by się stało, gdyby Usernie istniało?
senaps
jak możemy zastąpić / rozszerzyć tę metodę delete ()? dla klasy zdefiniowanej przez użytkownika w naszym models.py w aplikacji flask.
Hossein
36

Po prostu chcę udostępnić inną opcję:

# 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

W tym przykładzie następujące kody będą działać dobrze:

obj = User.query.filter_by(id=123).one()
session.delete(obj)
session.commit()
Steve
źródło
Otrzymuję błąd, że sesja jest używana
Ryan Aquino
9

Inne możliwe rozwiązanie, szczególnie jeśli chcesz usunąć zbiorczo

deleted_objects = User.__table__.delete().where(User.id.in_([1, 2, 3]))
session.execute(deleted_objects)
session.commit()
Zaytsev Dmitry
źródło