Flask-SQLAlchemy cách xóa tất cả các hàng trong một bảng


97

Làm cách nào để xóa tất cả các hàng trong một bảng bằng Flask-SQLAlchemy?

Tìm kiếm một cái gì đó như thế này:

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

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

Câu trả lời:


137

Hãy thử delete:

models.User.query.delete()

Từ các tài liệu :Returns the number of rows deleted, excluding any cascades.


2
Hmm, điều này làm việc cho tôi, nhưng chỉ sau khi thay đổi một cái gì đó như thế này:models.User.query().delete()
killthrush

1
Không hoạt động nếu bạn sử dụng một truy vấn như sau:Model.query.filter(Model.some_id == some_id, Model.other_id.in_(other_ids).delete()
swade

5
Đừng quên cam kết sau khi xóa.
Kevin,

3
Nếu bạn đang sử dụng Flask-SQLAlchemythì hãy thử User.query.delete()làm queryđối tượng vì đối tượng 'BaseQuery' không thể gọi được. Đã kiểm tra và xác minh.
Shirish Kadam

99

Câu trả lời của DazWorrall là đúng. Đây là một biến thể có thể hữu ích nếu mã của bạn được cấu trúc khác với mã OP:

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

Ngoài ra, đừng quên rằng việc xóa sẽ không có hiệu lực cho đến khi bạn cam kết, như trong đoạn mã này:

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

50

Flask-Sqlalchemy

Xóa tất cả các bản ghi

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

Đã xóa hàng đơn

ở đây DB là đối tượng lớp Flask-SQLAlchemy. Nó sẽ xóa tất cả các bản ghi khỏi nó và nếu bạn muốn xóa các bản ghi cụ thể thì hãy thử filtermệnh đề trong truy vấn. Ví dụ.

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

Xóa bản ghi đơn theo đối tượng

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
Tôi đang ở trong một loại tình huống tương tự. Giả sử hiện tại có 4 bản ghi trong bảng, từ id 1 đến 4. Khi tôi thực hiện db.session.query (Table_name) .delete () db.session.commit () và sau đó nếu tôi thực hiện db.session .add () một lần nữa để thêm các bản ghi mới, bản ghi tiếp theo có id là 5. Vì bảng của tôi bây giờ trống, tôi muốn các bản ghi mới của mình bây giờ nhận lại id bắt đầu từ 1. Tôi có thể làm cái này như thế nào ?
qre0ct

Vui lòng tham khảo liên kết này stackoverflow.com/questions/23038422/…
Anand Tripathi,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.