2010-06-07 13 views
39

Para vaciar una tabla de base de datos, utilizo esta consulta SQL:¿Cómo TRONCATE LA TABLA usando el ORM de Django?

TRUNCATE TABLE `books` 

Cómo trunco ​​una tabla usando modelos y ORM de Django?

He intentado esto, pero no funciona:

Book.objects.truncate() 
+0

Mientras que usted tiene varias buenas respuestas a continuación, usted debe darse cuenta que la tabla en su base de datos SQL habrá appname_ antepone al nombre de tabla de su modelo. –

+0

Con cualquier SQL, no solo TRUNCATE: http://stackoverflow.com/questions/4532681/how-to-remove-all-of-the-data-in-a-table-using-django –

Respuesta

52

Lo más cerca que obtendrá con el ORM es Book.objects.all().delete().

Sin embargo, existen diferencias: truncar será probablemente más rápido, pero el ORM también buscará referencias de claves externas y eliminará objetos en otras tablas.

+0

Gracias. Esto hace el truco. La velocidad no es importante en mi caso. –

+4

esto parece no funcionar para todos los back-end de la base de datos: obtuve un DatabaseError "demasiadas variables SQL" cuando intenté lo anterior en una tabla con aproximadamente 3000 registros en sqlite3. Tal vez solo me falta un valor de configuración para dosificar/sqlite. –

+0

@BernhardKircher: vea mi adición como una respuesta separada –

25

Puede hacerlo de una manera rápida y liviana, pero sin utilizar el ORM de Django. Es posible ejecutar SQL crudo con una conexión Django cursor:

from django.db import connection 
cursor = connection.cursor() 
cursor.execute("TRUNCATE TABLE `books`") 
+0

Gracias, pero prefiero hacer que mis aplicaciones funcionen con la mayor cantidad posible de motores de base de datos y no para usar raw sql –

+7

TRUNCATE TABLE es una parte de la sintaxis SQL "típica", aunque oficialmente solo es una parte de SQL: 2008. Django admite Postgres, MySQL, SQLite * y Oracle. http://www.postgresql.org/docs/8.1/interactive/sql-truncate.html http://dev.mysql.com/doc/refman/4.1/en/truncate-table.html http: //download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_10006.htm * SQLite le falta el soporte TRUNCATE [TABLE], necesita utilizar DELETE FROM para ello. Esto, por supuesto, solo es aplicable si necesita rendimiento. – Aea

+0

También puede haber un problema con truncar (dependiendo del sistema de base de datos utilizado). P.ej. Microsoft SQL Server dows no permite un truncado en las tablas a las que se hace referencia con Foreignkeys. Solo quería mencionar esto, quizás otros sistemas DB tengan un comportamiento diferente. –

21

Puede utilizar la propiedad _meta del modelo para rellenar el nombre de la tabla de base de datos:

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

Importante: Esto no funciona para heredada modelos ya que abarcan múltiples tablas!

8

Además de la respuesta de Ned Batchelder y refiriéndose al comentario de Bernhard Kircher:

En mi caso necesario para vaciar una base de datos muy grande utilizando la aplicación web:

Book.objects.all().delete() 

Lo cual, en el entorno de desarrollo SqlLite , devuelto:

too many SQL variables 

Así que agregué un poco de solución. Es quizás no es el más bonito, pero al menos funciona hasta que la opción de truncamiento de tabla es construir en 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() 

Por cierto, algunos de mi código se basaba en "Django Delete all but last five of queryset".

Lo agregué sabiendo que la respuesta ya estaba respondida, pero espero que esta adición ayude a otras personas.

+0

Bueno, pero en mi MySQL: 'NotSupportedError: (1235," Esta versión de MySQL aún no admite 'LIMIT & IN/ALL/ANY/ALGUNA subconsulta' ")' – bartekbrak

+0

y ¿qué versión es esa? (Ambos, mysql y django) Haciendo una búsqueda de Google en esto, se me ocurrió la versión 5.0 de mysql (¿es correcto?) Pero para una versión de django muy antigua que ya no se admite ... (https://code.djangoproject.com/ticket/10099) –

-1

Esto no responde directamente a la pregunta del OP, pero sin embargo es una solución que se podría usar para lograr lo mismo, de manera diferente.


Bueno, por alguna extraña razón (al intentar utilizar los métodos RAW sugeridas en las otras respuestas aquí), no he logrado truncar mi tabla de caché de base de datos de Django hasta que hice algo como esto:

import commands 
cmd = ['psql', DATABASE, 'postgres', '-c', '"TRUNCATE %s;"' % TABLE] 
commands.getstatusoutput(' '.join(cmd)) 

Básicamente, tuve que recurrir a emitir el comando truncate a través de los comandos de utilidad de la base de datos - psql en este caso, ya que estoy usando Postgres. Entonces, la automatización de la línea de comando podría manejar tales casos de esquina.

Podría salvar a alguien más en algún momento ...

1

Ahora hay una biblioteca para ayudarlo a truncar una TABLA específica en su base de datos del proyecto Django, llamó django-truncate.

¡Simplemente ejecute python manage.py truncate --apps myapp --models Model1 y se borrarán todos los datos en esa TABLA!

aprender más sobre él aquí: https://github.com/KhaledElAnsari/django-truncate

+1

Este comando de administración no parece truncar tablas. Su implementación parece estar llamando '_model.objects.all(). Delete()', que definitivamente NO es un truncado. https://github.com/KhaledElAnsari/django-truncate/blob/master/django_truncate/management/commands/truncate.py – BrennanR

Cuestiones relacionadas