Django 1.7 introduziu migrações de banco de dados .
Ao executar os testes de unidade no Django 1.7, ele força uma migração , que leva muito tempo. Então, eu gostaria de pular as migrações do django e criar o banco de dados no estado final.
Sei que ignorar as migrações pode ser uma prática ruim, pois essa parte do código não seria testada. Mas não é o caso: estou executando as migrações completas no servidor de teste CI (jenkins). Eu só quero pular as migrações em meus testes locais, onde a velocidade é importante.
Algum contexto:
Até o Django 1.6 , ao usar South, eu usava a configuração SOUTH_TESTS_MIGRATE :
Por padrão, o comando syncdb do South também aplicará migrações se for executado no modo não interativo, o que inclui quando você estiver executando testes - ele executará todas as migrações sempre que você executar seus testes.
Se você deseja que o executor de teste use syncdb em vez de migrar - por exemplo, se suas migrações estão demorando muito para serem aplicadas - simplesmente defina SOUTH_TESTS_MIGRATE = False em settings.py.
No entanto, o syncdb não existe mais, agora é migrar .
E a partir do Django 1.8 , usarei o parâmetro --keepdb :
A opção --keepdb pode ser usada para preservar o banco de dados de teste entre execuções de teste. Isso tem a vantagem de ignorar as ações de criação e destruição, o que diminui muito o tempo de execução dos testes, especialmente aqueles em um grande conjunto de testes. Se o banco de dados de teste não existir, ele será criado na primeira execução e, em seguida, preservado para cada execução subsequente. Todas as migrações não aplicadas também serão aplicadas ao banco de dados de teste antes de executar o conjunto de testes.
Portanto, esta questão está limitada ao Django 1.7.
fonte
django-test-without-migrations
pacote tem sido muito útil para mim, você pode alterar a resposta aceita para stackoverflow.com/a/28993456/200224Respostas:
Veja esta solução alternativa , postada por Bernie Sumption na lista de discussão de desenvolvedores Django:
No Django 1.9, essa situação melhorou um pouco e você pode definir o valor para
None
:MIGRATION_MODULES = {"myapp": Nenhum}
fonte
myapp.migrations_not_used_in_tests
módulo não deve existir.Aqui está o final do meu arquivo de configurações:
com base neste trecho
Desativei as migrações apenas quando os testes estão em execução
fonte
__setitem__(self, *_)
método também porque tivemos problemas com aplicativos que definem sua própria migração, comosettings.MIGRATION_MODULES['chroniker'] = 'db_migrations'
django-test-without-migrations adiciona um
--nomigrations
sinalizador amanage.py test
. Funciona como um encanto.fonte
Atualização : Não importa, essa mudança foi revertida antes do lançamento do 1.10 final. Esperançosamente ele retornará em uma versão futura.
Note que a partir do Django 1.10 isso pode ser controlado por uma configuração de banco de dados de teste.
fonte
https://gist.github.com/apollovy/22826f493ad2d06d9a9a22464730ce0b
fonte
Para django 1.9 e superior, a resposta de Guillaume Vincent não funciona mais, então aqui está uma nova solução:
Estou usando este snippet no meu arquivo de configurações, após a definição do
INSTALLED_APPS
Ele itera sobre todos os aplicativos instalados e marca cada um como não tendo módulo de migração. Veja a documentação do django para mais informações .
Usando este snippet você pode executar seus testes, definindo a variável de ambiente
TESTS_WITHOUT_MIGRATIONS
, por exemplo:fonte
Acabei de descobrir como desabilitar migrações depois do django 1.10, pode ser que possa ajudar alguém. Aqui está o link do git
Migrations for django 1.10 tem duas partes, por favor, olhe para load_disk e gravador
A parte de
load_disk
para o modelo de migração do aplicativo que deve ser adicionado emINSTALL_APP
E a parte derecorder
para a conexão do banco de dados Para a versão anterior à 1.9, precisamos definirMIGRATION_MODULES={'do.not.migrate':'notmigrations'}
quando você estiver executando o teste Agora precisamos defini-lo Nenhum comoMIGRATION_MODULES={'do.not.migrate':None}
Então, se não quisermos fazer migrações para nenhum aplicativo , basta estender um dict e retornarNone
para agetitem
função e fazer o mesmo emDATABASES
, essa é a coisa certa que você precisa fazerPS: Para o comando, você precisa especificar
--setting=module.path.settings_test_snippet
apóstest
PPS. Se você estiver trabalhando compycharm
, não defina--settings
opções emRun/Debug configurations
, apenas adicione o caminho desettings_test_snippet.py
em Configuração personalizada. Isso fica bem !!desfrutar
fonte