2011-10-28 16 views
10

Estoy tratando de sincronizar datos entre dos instalaciones de django (producción y prueba). Estoy haciendo esto usando ./manage.py dumpdata --natural en producción, luego ./manage.py loaddata en una base de datos recientemente actualizada syncdb 'en pruebas.Django: elimine todos los datos de todas las tablas (pero conserve las tablas)

Todo funcionaba bien hasta que agregué un nuevo permiso personalizado. La producción syncdb cargó este nuevo permiso en un orden diferente (con una clave primaria diferente) que un nuevo syncdb en una base de datos vacía. En consecuencia, obtiene una ID diferente. Así que a pesar de utilizar claves naturales, cuando intento cargar los datos, estoy recibiendo este error cuando se carga el primer objeto de permiso fuera de orden:

IntegrityError: duplicate key value violates unique constraint "auth_permission_content_type_id_codename_key" 

La forma más sencilla que puedo pensar para solucionar este problema es eliminar todos los datos de cada tabla en la instalación de prueba, es decir, usar syncdb solo para crear tablas, y para no cargar también los datos iniciales. Pero syncdb no le permite omitir el paso de datos/señales iniciales. En vez de enumerar explícitamente cada modelo o nombre de tabla, ¿cómo puedo eliminar todos los datos iniciales después de llamar al syncdb? ¿O hay una manera de crear solo las tablas vacías sin usar syncdb?

./manage.py flush no es lo que busco: recarga los datos iniciales y activa las señales syncdb.

Respuesta

9

De acuerdo con la ayuda para el comando flush (estoy usando Django 1.3.1) el SQL que se ejecuta es el mismo SQL obtenido de ./manage.py sqlflush, y luego se vuelve a instalar los accesorios de datos iniciales.

$ python manage.py help flush 
Usage: manage.py flush [options] 

Executes ``sqlflush`` on the current database. 

para obtener la misma capacidad de borrado de los datos menos la carga de aparato que puede obtener el SQL llamando ./manage.py sqlflush y luego ejecutar ese SQL usando Django soporte integrado para ejecutar SQL arbitrario:

from django.core.management import call_command, setup_environ 
from your_django_project import settings 
setup_environ(settings) 

from django.db import connection 
from StringIO import StringIO 

def main(): 
    # 'call' manage.py flush and capture its outputted sql 
    command_output = StringIO() 
    call_command("sqlflush", stdout=command_output) 

    command_output.seek(0) 
    flush_sql = command_output.read() 

    # execute the sql 
    # from: https://docs.djangoproject.com/en/dev/topics/db/sql/#executing-custom-sql-directly 
    cursor = connection.cursor() 
    cursor.execute(flush_sql) 

    print "db has been reset" 

if __name__ == '__main__': 
    main() 

Este tiene la ventaja adicional de que puede modificar el SQL de ./manage.py sqlflush antes de la ejecución para evitar borrar las tablas que puede dejar intactas.

Además, según the current Django docs, en Django 1.5 un nuevo parámetro ./manage.py flush --no-initial-data restablecerá los datos y no cargará el dispositivo de datos inicial.

0

Para Django < = 1.4, puede usar el comando de administración reset.

./manage.py sqlreset myapp1 myapp2 
+1

restablecer está en desuso, como mencionan los documentos que enlaza; pero requiere que enumere cada aplicación, lo cual quiero evitar. Flush es su reemplazo; pero carga datos iniciales. – user85461

+0

obsoleto no significa que no pueda usarlo. Si no quiere enumerar los nombres de las aplicaciones, creo que tendrá que escribir su propio comando de administración. – Alasdair

+0

Se elimina en 1.5. desafortunadamente, no parece que haya una manera de limpiar una sola aplicación más :( – Andre

Cuestiones relacionadas