Flask-SQLAlchemy tek bir tablodaki tüm satırları silme


101

Flask-SQLAlchemy kullanarak tek bir tablodaki tüm satırları nasıl silebilirim?

Bunun gibi bir şey arıyorum:

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

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

Yanıtlar:


140

Deneyin delete:

models.User.query.delete()

Gönderen docs :Returns the number of rows deleted, excluding any cascades.


2
Hmm, bu benim için işe yaradı, ancak bunu böyle bir şeye değiştirdikten sonra:models.User.query().delete()
killthrush

1
Model.query.filter(Model.some_id == some_id, Model.other_id.in_(other_ids).delete()
Şunun

7
Sildikten sonra taahhüt etmeyi unutmayın.
Kevin

3
Eğer kullanıyorsanız Flask-SQLAlchemyo zaman denemek User.query.delete()olarak query'BaseQuery' nesne çağrılabilir olmadığından nesne. Test edildi ve doğrulandı.
Shirish Kadam

108

DazWorrall'ın cevabı yerinde. Kodunuz OP'lerden farklı bir şekilde yapılandırılmışsa yararlı olabilecek bir varyasyon:

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

Ayrıca, bu kod parçacığında olduğu gibi, işlemin tamamlanana kadar silme işleminin etkili olmayacağını unutmayın:

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

53

Flask-Sqlalchemy

Tüm Kayıtları Sil

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

Tek Satır Silindi

burada DB, Flask-SQLAlchemy sınıfı nesnesidir. Tüm kayıtları ondan siler ve belirli kayıtları silmek isterseniz filter, sorgudaki maddeyi deneyin . ör.

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

Tek Kaydı Nesneye Göre Sil

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
Ben de benzer bir durumdayım. Şu an itibariyle tabloda id 1'den 4'e kadar 4 kayıt olduğunu varsayalım. Bir db.session.query (Table_name) .delete () db.session.commit () yaptığımda ve sonra bir db.session yaparsam .add () tekrar yeni kayıt eklemek için, sonraki kayıt 5 kimliğini alır. Tablom şimdi boş olduğundan, yeni kayıtlarımın şimdi 1'den başlayarak bir kimlik almasını istiyorum. Bunu nasıl yapabilirim ?
qre0ct

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.