Django 1.7 introdujo migraciones de bases de datos .
Al ejecutar las pruebas unitarias en Django 1.7, obliga a migración , que lleva mucho tiempo. Entonces me gustaría omitir las migraciones de Django y crear la base de datos en el estado final.
Sé que ignorar las migraciones puede ser una mala práctica, ya que esa parte del código no se probaría. Pero ese no es el caso: estoy ejecutando las migraciones completas en el servidor de prueba de CI (jenkins). Solo quiero omitir las migraciones en mis pruebas locales, donde la velocidad importa.
Algo de contexto:
Hasta Django 1.6 , cuando usaba South, usaba SOUTH_TESTS_MIGRATE configuración :
De forma predeterminada, el comando syncdb de South también aplicará migraciones si se ejecuta en modo no interactivo, lo que incluye cuando está ejecutando pruebas; ejecutará todas las migraciones cada vez que ejecute sus pruebas.
Si desea que el ejecutor de prueba use syncdb en lugar de migrar, por ejemplo, si sus migraciones están tardando demasiado en aplicarse, simplemente configure SOUTH_TESTS_MIGRATE = False en settings.py.
Sin embargo, syncdb ya no existe, ahora está migrando .
Y a partir de Django 1.8 Voy a usar el --keepdb parámetro:
La opción --keepdb se puede utilizar para preservar la base de datos de prueba entre ejecuciones de prueba. Esto tiene la ventaja de omitir las acciones de creación y destrucción, lo que reduce en gran medida el tiempo para ejecutar las pruebas, especialmente las que se encuentran en un conjunto de pruebas grande. Si la base de datos de prueba no existe, se creará en la primera ejecución y luego se conservará para cada ejecución posterior. Cualquier migración no aplicada también se aplicará a la base de datos de prueba antes de ejecutar el conjunto de pruebas.
Entonces esta pregunta se limita a Django 1.7.
fuente
django-test-without-migrations
paquete ha sido realmente útil para mí, es posible que desee cambiar la respuesta aceptada a stackoverflow.com/a/28993456/200224Respuestas:
Mire esta solución , publicada por Bernie Sumption en la lista de correo de desarrolladores de Django:
En Django 1.9, esta situación ha mejorado un poco y puede establecer el valor en
None
:MIGRATION_MODULES = {"myapp": Ninguno}
fuente
myapp.migrations_not_used_in_tests
módulo no debería existir.Aquí está el final de mi archivo de configuración:
basado en este fragmento
Inhabilité las migraciones solo cuando las pruebas se están ejecutando
fuente
__setitem__(self, *_)
método porque tuvimos problemas con las aplicaciones que configuran su propia migración comosettings.MIGRATION_MODULES['chroniker'] = 'db_migrations'
django-test-without-migrations agrega una
--nomigrations
marca amanage.py test
. Funciona de maravilla.fuente
Actualización : no importa, este cambio se revirtió antes de que se lanzara la versión 1.10 final. Ojalá vuelva en una versión futura.
Tenga en cuenta que a partir de Django 1.10 esto se puede controlar mediante una configuración de base de datos de prueba.
fuente
https://gist.github.com/apollovy/22826f493ad2d06d9a9a22464730ce0b
fuente
Para django 1.9 y versiones posteriores, la respuesta de Guillaume Vincent ya no funciona, así que aquí hay una nueva solución:
Estoy usando este fragmento en mi archivo de configuración, después de la definición del
INSTALLED_APPS
Repite todas las aplicaciones instaladas y las marca como sin módulo de migración. Consulte los documentos de django para obtener más información .
Con este fragmento, puede ejecutar sus pruebas, configurando la variable de entorno
TESTS_WITHOUT_MIGRATIONS
, por ejemplo:fuente
Acabo de descubrir cómo deshabilitar las migraciones después de django 1.10, puede ser que pueda ayudar a alguien. Aquí hay un enlace en git
Las migraciones para django 1.10 tienen dos partes, consulte load_disk y recorder
La parte de
load_disk
las migraciones modelo de aplicación que se añade aINSTALL_APP
Y la parte derecorder
las conexiones de base de datos para la versión antes de 1.9 Tenemos que establecemosMIGRATION_MODULES={'do.not.migrate':'notmigrations'}
cuando se está ejecutando la prueba Ahora necesitamos propusimos que nadie comoMIGRATION_MODULES={'do.not.migrate':None}
lo tanto, si no queremos que las migraciones de maquillaje para cualquier aplicación , simplemente extienda un dictado y regreseNone
paragetitem
función, y haga lo mismo enDATABASES
, eso es lo correcto que debe hacerPD: Para el comando, debe especificar
--setting=module.path.settings_test_snippet
después detest
PPS. Si está trabajando conpycharm
, no configure las--settings
opciones enRun/Debug configurations
, simplemente agregue la ruta desettings_test_snippet.py
en Configuración personalizada. ¡¡Eso estará bien !!disfrutar
fuente