วิธีลบเร็กคอร์ดโดย id ใน Flask-SQLAlchemy


128

ฉันมีusersตารางในฐานข้อมูล MySql ของฉัน ตารางนี้มีid, nameและageสาขา

ฉันจะลบบางบันทึกโดยid?

ตอนนี้ฉันใช้รหัสต่อไปนี้:

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

แต่ฉันไม่ต้องการสอบถามใด ๆ ก่อนลบการดำเนินการ มีวิธีใดบ้างที่จะทำเช่นนี้? ฉันรู้ฉันสามารถใช้ได้db.engine.execute("delete from users where id=...")แต่ฉันต้องการใช้delete()วิธีการ

คำตอบ:


206

คุณสามารถทำได้

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

หรือ

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

ให้แน่ใจว่าจะcommitสำหรับการdelete()มีผลบังคับใช้


19
ให้แน่ใจว่าคุณได้db.session.commit()สิ้นสุด โดยที่ฐานข้อมูล: db = SQLAlchemy(app)
เบ็น

ใช้ IN กับวิธีนี้ได้ไหม
ram4nd

10
คำเตือน: สิ่งdeleteนี้จะไม่เรียงซ้อนหากคุณใช้การเรียงซ้อนใน python / ORM คุณจะต้องสอบถามวัตถุแรกและจากนั้นลบ
n Nirvana-msu

5
จะเกิดอะไรขึ้นถ้าUserไม่มี?
senaps

เราจะแทนที่ / ขยายวิธีการลบ () นี้ได้อย่างไร? สำหรับคลาสที่ผู้ใช้กำหนดไว้ใน models.py ของเราในแอพ flask
Hossein

36

เพียงแค่ต้องการแบ่งปันตัวเลือกอื่น:

# 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

ในตัวอย่างนี้รหัสต่อไปนี้จะใช้ได้ดี:

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

ฉันได้รับข้อผิดพลาดว่ามีการใช้งานเซสชัน
Ryan Aquino

9

อีกวิธีหนึ่งที่เป็นไปได้โดยเฉพาะหากคุณต้องการลบแบทช์

deleted_objects = User.__table__.delete().where(User.id.in_([1, 2, 3]))
session.execute(deleted_objects)
session.commit()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.