2010-02-18 11 views
15

¿Cómo reinicio completamente mi Django (1.2 alpha) DB (soltando todas las tablas, en lugar de simplemente borrarlas)?Complete django DB reinicio

manage.py flush hace muy poco (no funcionará si hay cambios de esquema) y manage.py reset requiere que especifique todas las aplicaciones (y parece tomar un formato que es diferente de solo "" .join (INSTALLED_APPS)). Obviamente, puedo lograr esto de una manera específica de DB, pero pensé que debe haber una manera sana, DB backend agnóstica para hacer esto.

[Editar: Estoy buscando algo que pueda llamar desde un script, p. un Makefile y que continúa trabajando si cambio de la base de datos back-end o añadir a settings.INSTALLED_APPS]

Respuesta

16

This Snippet le da el código para un comando manage.py reset_db puede instalar, que es el mínimo cambio que resuelve su problema


Dicho esto, a partir de comentarios a continuación:

puede ser que también acaba instalar las extensiones de comando de Django para obtener reset_db y otras cosas buenas: https://github.com/django-extensions/django-extensions

+7

También podría instalar las extensiones de comando de Django para obtener reset_db y otras ventajas: http://code.google.com/p/django-command-extensions/ –

+0

¡Eso parece prometedor! – jathanism

+0

Genial, ¡eso parece exactamente lo que necesito! –

1

¿Quieres sqlreset:

% python manage.py help sqlreset 
Usage: manage.py sqlreset [options] <appname appname ...> 

Prints the DROP TABLE SQL, then the CREATE TABLE SQL, for the given app name(s). 

Options: 
    -v VERBOSITY, --verbosity=VERBOSITY 
         Verbosity level; 0=minimal output, 1=normal output, 
         2=all output 
    --settings=SETTINGS The Python path to a settings module, e.g. 
         "myproject.settings.main". If this isn't provided, the 
         DJANGO_SETTINGS_MODULE environment variable will be 
         used. 
    --pythonpath=PYTHONPATH 
         A directory to add to the Python path, e.g. 
         "/home/djangoprojects/myproject". 
    --traceback   Print traceback on exception 
    --version    show program's version number and exit 
    -h, --help   show this help message and exit 

Al igual que cuando se modifica un modelo, Django no lo hará automáticamente para usted. Solo emitirá los comandos para que los copie y pegue.

+0

'manage.py reset' que mencioné anteriormente simplemente es un envoltorio alrededor de' sqlreset' por lo que exactamente el mismo problema se aplica: no quiero enumerar manualmente todos los nombres de aplicación. Quiero una solución que se pueda automatizar y siga funcionando si agrego 'INSTALLED_APPS' en' settings.py'. –

+0

Tendrás que rodar tu propio guión luego. No creo que esta funcionalidad exista tal cual. – jathanism

0

Simplemente asigne una nueva base de datos y suelte este db de la consola de db. Me parece que es lo más simple.

+0

Lo siento, debería haber dejado en claro que necesito algo que pueda automatizarse. –

+0

@as: ¿Cómo es que una base de datos no se puede automatizar? ¿Cuál es tu base de datos? Escriba un script SQL para 'DROP DATABASE x;' y ejecútelo. –

-1

eche un vistazo al comando reset en el código de django, y escriba el suyo que primero suelta/crea DB.

0

Hm, tal vez se encuentran a manage.py, pretendiendo hacer accesorios, pero sólo para buscar aplicaciones:

aplicaciones = $ (python manage.py makefixture 2> & 1 | egrep -v ' (^ Error |^django) '| awk -F.' {Print $ 2} '| uniq); para yo en $ aplicaciones; hacer python manage.py sqlreset $ i; hecho | grep DROP

Que imprime una lista de sentencias DROP TABLE para todas las tablas de aplicaciones de su proyecto, excluyendo las tablas django. Si desea incluirlos, elimine el patrón |^django vom egrep.

¿Pero cómo alimentar el back-end de la base de datos correcta? sed/awk-ing a través de settings.conf? O mejor, utilizando un pequeño script settings.conf-reading python.

0

Suponiendo que está (por suerte) en un entorno Linux, así como:

  • usando MySQL y saber de usuario/contraseña para acceder db del proyecto
  • fiesta, MySQL, readlink están instalados
  • settings.py es la configuraciónpy
  • nombredb es el mismo que el nombre del proyecto Django (ver MIAPL var adelante)
  • todas las aplicaciones que desea restablecer se enumeran en INSTALLED_APPS como cadenas con los nombres de módulos completos (empezando por el nombre de su Django proyecto)

Cambie su carpeta actual a su código de proyecto donde residen manage.py y settings.py. A continuación, ejecute lo siguiente:

MYAPP=$(basename $(dirname `readlink -m settings.py`));DJANGOAPPS=$(echo 'import settings; print " ".join([ str(app).lstrip("'${MYAPP}'.") for app in settings.INSTALLED_APPS if "'${MYAPP}'" in app ])' | python -); python manage.py sqlreset $DJANGOAPPS | mysql -u root --password ${MYAPP} 

Si usted entiende lo que está pasando en este oneliner fiesta - no debería ser un problema para construir sobre esta idea (por ejemplo ponerlo a Makefile).

+0

Tenga en cuenta que echo 'DROP DATABASE dbx;' | mysql dbx como lo sugiere S.Lott también funciona en el mundo de la línea de comandos de Unix. Entonces solo llamas a syncdb –