Flask-SQLAlchemy単一テーブルのすべての行を削除する方法


97

Flask-SQLAlchemyを使用して単一のテーブルのすべての行を削除するにはどうすればよいですか?

このようなものを探しています:

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

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

回答:


137

試してくださいdelete

models.User.query.delete()

ドキュメントから:Returns the number of rows deleted, excluding any cascades.


2
うーん、これは私にとってはmodels.User.query().delete()
うまくいきましたが

1
次のようなクエリを使用する場合は機能しません:Model.query.filter(Model.some_id == some_id, Model.other_id.in_(other_ids).delete()
swade

5
削除した後でコミットすることを忘れないでください。
ケビン

3
使用している場合は、「BaseQuery」オブジェクトを呼び出すことができないため、オブジェクトとしてFlask-SQLAlchemy試してください。テストおよび検証済み。User.query.delete()query
Shirish Kadam

99

DazWorrallの答えはスポットです。コードの構造がOPとは異なる場合に役立つバリエーションを次に示します。

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

また、次のスニペットのように、コミットするまで削除が有効にならないことを忘れないでください。

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

50

フラスコ・スクエアケミー

すべてのレコードを削除

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

単一行を削除しました

ここで、DBはオブジェクトFlask-SQLAlchemyクラスです。そこからすべてのレコードが削除さfilterれます。特定のレコードを削除する場合は、クエリの句を試してください。例:

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

オブジェクトごとに単一のレコードを削除

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
私も似たような状況です。テーブルには現在、ID 1から4までの4つのレコードがあるとします。db.session.query(Table_name).delete()db.session.commit()を実行すると、db.sessionを実行すると.add()をもう一度実行して新しいレコードを追加すると、次のレコードのIDは5になります。テーブルが空になっているので、新しいレコードに再び1から始まるIDを取得させます。これどうやってするの ?
qre0ct 2016年

このリンクを参照してください。stackoverflow.com
questions/23038422/…
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.