web-dev-qa-db-fra.com

Comment TRUNCATE TABLE en utilisant l'ORM de Django?

Pour vider une table de base de données, j'utilise cette requête SQL:

TRUNCATE TABLE `books`

Comment tronquer une table en utilisant les modèles et ORM de Django?

J'ai essayé ça, mais ça ne marche pas:

Book.objects.truncate()
44
Silver Light

Le plus proche que vous obtiendrez avec l'ORM est Book.objects.all().delete().

Il existe cependant des différences: les tronçons seront probablement plus rapides, mais l'ORM poursuivra également les références aux clés étrangères et supprimera les objets des autres tables.

57
Ned Batchelder

Vous pouvez le faire de manière rapide et légère, sans utiliser l'ORM de Django. Vous pouvez exécuter du SQL brut avec un curseur de connexion Django:

from Django.db import connection
cursor = connection.cursor()
cursor.execute("TRUNCATE TABLE `books`")
29
Shamanu4

Vous pouvez utiliser la propriété _meta du modèle pour renseigner le nom de la table de base de données:

from Django.db import connection
cursor = connection.cursor()
cursor.execute('TRUNCATE TABLE "{0}"'.format(MyModel._meta.db_table))

Important : Cela ne fonctionne pas pour les modèles hérités car ils couvrent plusieurs tables!

23
Brendan Annable

Outre la réponse de Ned Batchelder et son commentaire à Bernhard Kircher:

Dans mon cas, je devais vider une très grande base de données à l'aide de l'application Web:

Book.objects.all().delete()

Ce qui, dans l'environnement de développement SQLlite, a renvoyé:

too many SQL variables

J'ai donc ajouté une petite solution de contournement. Ce n'est peut-être pas le meilleur, mais au moins, cela fonctionne jusqu'à ce que l'option de table tronquée soit intégrée à l'ORM de Django:

countdata = Book.objects.all().count()
logger.debug("Before deleting: %s data records" % countdata)
while countdata > 0:
    if countdata > 999:
        objects_to_keep = Book.objects.all()[999:]
        Book.objects.all().exclude(pk__in=objects_to_keep).delete()
        countdata = Book.objects.all().count()
    else:
        Book.objects.all().delete()
        countdata = Book.objects.all().count()

En passant, une partie de mon code était basée sur " Django Supprimer tout sauf les cinq derniers de queryset ".

J'ai ajouté ceci tout en sachant que la réponse avait déjà été donnée, mais j'espère que cet ajout aidera d'autres personnes.

8
michel.iamit

Il existe maintenant une bibliothèque pour vous aider à tronquer une TABLE spécifique dans votre base de données de projets Django, Elle s'appelle Django-truncate .

C'est simple, il suffit d'exécuter python manage.py truncate --apps myapp --models Model1 et toutes les données de cette table seront supprimées!

En savoir plus à ce sujet ici: https://github.com/KhaledElAnsari/Django-truncate

0
Khaled Al-Ansari