Django 1.7 은 데이터베이스 마이그레이션을 도입했습니다 .
Django 1.7에서 단위 테스트를 실행하면 시간이 오래 걸리는 migrate를 강제 실행합니다 . 그래서 장고 마이그레이션을 건너 뛰고 최종 상태에서 데이터베이스를 만들고 싶습니다.
마이그레이션을 무시하는 것은 코드의 해당 부분이 테스트되지 않기 때문에 나쁜 습관이 될 수 있다는 것을 알고 있습니다. 그러나 그것은 사실이 아닙니다. 저는 CI 테스트 서버 (jenkins)에서 전체 마이그레이션을 실행하고 있습니다. 속도가 중요한 로컬 테스트에서만 마이그레이션을 건너 뛰고 싶습니다.
일부 컨텍스트 :
Django 1.6 까지는 South를 사용할 때 SOUTH_TESTS_MIGRATE 설정을 사용했습니다 .
기본적으로 South의 syncdb 명령은 테스트를 실행할 때를 포함하여 비대화 형 모드에서 실행되는 경우 마이그레이션도 적용합니다. 테스트를 실행할 때마다 모든 마이그레이션이 실행됩니다.
테스트 실행기가 마이그레이션 대신 syncdb를 사용하도록하려면 (예 : 마이그레이션을 적용하는 데 너무 오래 걸리는 경우) settings.py에서 SOUTH_TESTS_MIGRATE = False를 설정하면됩니다.
그러나 syncdb 는 더 이상 존재하지 않으며 이제 migrate 입니다.
그리고 Django 1.8 에서 –keepdb 매개 변수를 사용합니다 .
–keepdb 옵션을 사용하여 테스트 실행 사이에 테스트 데이터베이스를 보존 할 수 있습니다. 이는 생성 및 삭제 작업을 모두 건너 뛰는 이점이있어 특히 대규모 테스트 스위트의 테스트 실행 시간을 크게 단축합니다. 테스트 데이터베이스가 존재하지 않는 경우 첫 번째 실행시 생성 된 다음 이후 실행될 때마다 보존됩니다. 적용되지 않은 마이그레이션은 테스트 스위트를 실행하기 전에 테스트 데이터베이스에도 적용됩니다.
따라서이 질문은 Django 1.7로 제한됩니다.
답변
Bernie Sumption이 Django 개발자 메일 링리스트에 게시 한이 해결 방법을 살펴보십시오 .
makemigrations가 아직 실행되지 않은 경우 “migrate”명령은 앱을 마이그레이션되지 않은 것으로 처리하고 1.6에서 syncdb가 수행 한 것처럼 모델에서 직접 테이블을 만듭니다. 기본 설정 모듈에서 *를 가져오고 다음 줄을 추가하는 “settings_test.py”라는 단위 테스트를위한 새 설정 모듈을 정의했습니다.
MIGRATION_MODULES = { “myapp”: “myapp.migrations_not_used_in_tests”}
그런 다음 다음과 같은 테스트를 실행합니다.
DJANGO_SETTINGS_MODULE = “myapp.settings_test”python manage.py 테스트
이 바보는 앱이 마이그레이션되지 않았다고 생각하게되므로 테스트 데이터베이스가 생성 될 때마다 models.py의 현재 구조를 반영합니다.
Django 1.9에서는이 상황 이 다소 개선 되었으며 값을 None
다음 과 같이 설정할 수 있습니다 .
MIGRATION_MODULES = { “myapp”: 없음}
답변
내 설정 파일의 끝은 다음과 같습니다.
class DisableMigrations(object):
def __contains__(self, item):
return True
def __getitem__(self, item):
return None
TESTS_IN_PROGRESS = False
if 'test' in sys.argv[1:] or 'jenkins' in sys.argv[1:]:
logging.disable(logging.CRITICAL)
PASSWORD_HASHERS = (
'django.contrib.auth.hashers.MD5PasswordHasher',
)
DEBUG = False
TEMPLATE_DEBUG = False
TESTS_IN_PROGRESS = True
MIGRATION_MODULES = DisableMigrations()
이 스 니펫을 기반으로
테스트가 실행 중일 때만 마이그레이션을 비활성화했습니다.
답변
장고 – 시험없이-마이그레이션 추가 --nomigrations
에 플래그를 manage.py test
. 매력처럼 작동합니다.
답변
업데이트 : 신경 쓰지 마세요.이 변경 사항은 1.10 최종 버전이 출시되기 전에 되돌려졌습니다 . 바라건대 향후 버전에서 돌아올 것입니다.
Django 1.10부터는 테스트 데이터베이스 설정으로 제어 할 수 있습니다.
마이그레이션
기본:
True
로 설정하면
False
Django는 마이그레이션을 사용하여 테스트 데이터베이스를 생성하지 않습니다.
답변
https://gist.github.com/apollovy/22826f493ad2d06d9a9a22464730ce0b
MIGRATION_MODULES = {
app[app.rfind('.') + 1:]: 'my_app.migrations_not_used_in_tests'
for app in INSTALLED_APPS
}
답변
django 1.9 이상에서는 Guillaume Vincent의 답변이 더 이상 작동하지 않으므로 여기에 새로운 솔루션이 있습니다.
내 설정 파일에서이 스 니펫을 사용하고 있습니다. INSTALLED_APPS
if os.environ.get('TESTS_WITHOUT_MIGRATIONS', False):
MIGRATION_MODULES = {
app.split('.')[-1]: None for app in INSTALLED_APPS
}
설치된 모든 앱을 반복하고 각각 마이그레이션 모듈이없는 것으로 표시합니다. 자세한 내용은 django 문서를 참조하십시오 .
이 스 니펫을 사용하여 테스트를 실행하고 환경 변수를 설정할 수 있습니다 TESTS_WITHOUT_MIGRATIONS
. 예 :
TESTS_WITHOUT_MIGRATIONS=1 ./manage.py test
답변
나는 django 1.10 이후 마이그레이션을 비활성화하는 방법을 알아 냈습니다. 누군가에게 도움이 될 수 있습니다. 다음은 git의 링크입니다 .
class DisableMigrations(dict):
def __contains__(self, item):
return True
def __getitem__(self, item):
return None
DATABASES = DisableMigrations()
MIGRATION_MODULES = DisableMigrations()
django 1.10 마이그레이션은 두 부분으로 구성됩니다. load_disk 및 recorder를 참조하십시오.
load_disk
추가 된 앱의 마이그레이션 을 위한 INSTALL_APP
부분과 recorder
데이터베이스 연결 을 위한 부분 1.9 이전 버전의 MIGRATION_MODULES={'do.not.migrate':'notmigrations'}
경우 테스트를 실행할 때 설정해야합니다. 이제 설정해야합니다. None like MIGRATION_MODULES={'do.not.migrate':None}
그래서 우리가 어떤 앱에 대한 마이그레이션을 원하지 않는 경우 그냥 딕셔너리를 확장하고 반환 None
을위한 getitem
에서 동일한 기능, 그리고 어떻게 DATABASES
당신이해야 할 옳은 일입니다,
추신 : 명령의 경우, 당신은 지정해야합니다 --setting=module.path.settings_test_snippet
후 test
PPS 당신이 작업하는 경우 pycharm
, 하지 않는 설정 --settings
에서 옵션 Run/Debug configurations
, 단지의 경로를 추가 settings_test_snippet.py
사용자 설정에서. 괜찮아요 !!
즐겨