마지막 마이그레이션을 되돌리는 방법은 무엇입니까?
새 테이블을 추가한 마이그레이션을 수행했는데 새 마이그레이션을 만들지 않고 테이블을 되돌리고 마이그레이션을 삭제하려고 합니다.
제가 그걸 어떻게 합니까?마지막 마이그레이션을 되돌린 후 마이그레이션 파일을 삭제하는 명령이 있습니까?
이전 마이그레이션으로 마이그레이션하여 되돌릴 수 있습니다.
예를 들어, 마지막 두 마이그레이션이 다음과 같은 경우:
0010_previous_migration
0011_migration_to_revert
그러면 다음을 수행할 수 있습니다.
./manage.py migrate my_app 0010_previous_migration
실제로 전체 마이그레이션 이름을 사용할 필요는 없습니다. 숫자로 충분합니다.
./manage.py migrate my_app 0010
그런 다음 마이그레이션을 삭제할 수 있습니다.0011_migration_to_revert
.
Django 1.8+를 사용하는 경우 모든 마이그레이션의 이름을 표시할 수 있습니다.
./manage.py showmigrations my_app
앱에 대한 모든 마이그레이션을 되돌리려면 다음을 실행할 수 있습니다.
./manage.py migrate my_app zero
되돌리기 전까지는 마이그레이션 파일을 삭제하지 마십시오.이 오류를 범했습니다. 마이그레이션 파일이 없으면 데이터베이스에서 제거할 항목을 알 수 없습니다.
python manage.py showmigrations
python manage.py migrate {app name from show migrations} {00##_migration file.py}
모든 마이그레이션을 되돌리려면zero
마이그레이션 이름:
python manage.py migrate app_name_here zero
마이그레이션 파일을 삭제합니다.원하는 마이그레이션이 모델에 포함되면...
python manage.py makemigrations
python manage.py migrate
알라스데어의 대답은 기본을 다룹니다.
- 에서 원하는 합니다.
./manage.py showmigrations
migrate
및 이름 름마그레션이름사용이및앱이▁using사용
그러나 모든 이주가 되돌릴 수 있는 것은 아니라는 점을 지적해야 합니다.이것은 장고가 반전을 할 수 있는 규칙이 없는 경우에 발생합니다.자동으로 마이그레이션한 대부분의 변경 사항의 경우./manage.py makemigrations
반전이 가능할 것입니다.그러나 사용자 지정 스크립트에는 다음 예제에 설명된 대로 정방향 및 역방향이 모두 작성되어야 합니다.
https://docs.djangoproject.com/en/1.9/ref/migration-operations/
노옵 반전을 하는 방법
만약 당신이 가지고 있다면,RunPython
그러면 논리적으로 엄격한 역방향 스크립트를 작성하지 않고 마이그레이션을 백업할 수 있습니다.문서(위 링크)의 예제에 대한 다음과 같은 빠른 해킹을 통해 데이터베이스를 마이그레이션이 적용된 후와 같은 상태로 유지할 수 있습니다.
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
def forwards_func(apps, schema_editor):
# We get the model from the versioned app registry;
# if we directly import it, it'll be the wrong version
Country = apps.get_model("myapp", "Country")
db_alias = schema_editor.connection.alias
Country.objects.using(db_alias).bulk_create([
Country(name="USA", code="us"),
Country(name="France", code="fr"),
])
class Migration(migrations.Migration):
dependencies = []
operations = [
migrations.RunPython(forwards_func, lambda apps, schema_editor: None),
]
이것은 장고 1.8, 1.9에서 작동합니다.
업데이트: 이 문서를 작성하는 더 나은 방법은 교체하는 것입니다.lambda apps, schema_editor: None
와 함께migrations.RunPython.noop
위의 토막글에서.이것들은 둘 다 기능적으로 같은 것입니다.(댓글에 대한 크레딧)
위의 솔루션은 실제로 사용 사례를 다루지 않으므로 다음과 같은 솔루션을 사용할 경우RunPython
.
ORM을 통해 테이블에 액세스할 수 있습니다.
from django.db.migrations.recorder import MigrationRecorder
>>> MigrationRecorder.Migration.objects.all()
>>> MigrationRecorder.Migration.objects.latest('id')
Out[5]: <Migration: Migration 0050_auto_20170603_1814 for model>
>>> MigrationRecorder.Migration.objects.latest('id').delete()
Out[4]: (1, {u'migrations.Migration': 1})
따라서 테이블을 쿼리하고 자신과 관련된 항목을 삭제할 수 있습니다.이렇게 하면 세부적으로 수정할 수 있습니다.와 함께RynPython
마이그레이션은 추가/삭제/삭제된 데이터도 관리해야 합니다.위의 예는 Djang ORM을 통해 테이블에 액세스하는 방법만 표시합니다.
1.9.1에서 이 작업을 수행했습니다(생성된 마지막 또는 최근 마이그레이션 삭제).
rm <appname>/migrations/<migration #>*
예:
rm myapp/migrations/0011*
데이터베이스에 로그인하고 이 SQL을 실행했습니다(이 예에서는 postgress).
delete from django_migrations where name like '0011%';
그런 다음 방금 삭제한 마이그레이션 번호(이 경우 11)로 시작하는 새 마이그레이션을 생성할 수 있었습니다.
마이그레이션을 되돌리는 방법
python manage.py migrate <APP_NAME> <MIGRATION_NUMBER_PREFIX>
MIGRATION_NUMBER_PREFIX
예를 들어 되돌리려는 마이그레이션의 번호 접두사입니다.0001
에 0001_initial.py
그런 수.그런 다음 해당 마이그레이션을 삭제할 수 있습니다.
사용할 수 있습니다.
zero
앱의 모든 마이그레이션을 되돌릴 마이그레이션 번호로 지정합니다.
수동으로 생성된 테이블을 삭제할 수도 있습니다.
이와 함께 해당 마이그레이션 파일도 삭제해야 합니다.또한 해당 마이그레이션과 관련된 django-migrations 테이블(이 경우 마지막 항목)에서 해당 항목을 삭제해야 합니다.
이전 마이그레이션으로 마이그레이션하여 되돌릴 수 있습니다.
예를 들어 다음 명령을 사용합니다.
./manage.py migrate example_app one_left_to_the_last_migration
삭제합니다.last_migration
java.
마이그레이션을 되돌리는 중에 문제가 발생하여 문제가 발생한 경우 이를 수행할 수 있습니다.fake
이주
./manage.py migrate <name> --ignore-ghost-migrations --merge --fake
django 버전 < 1.7의 경우 다음에 항목이 생성됩니다.south_migrationhistory
테이블, 해당 항목을 삭제해야 합니다.
이제 마이그레이션을 쉽게 되돌릴 수 있습니다.
PS: 저는 많은 시간 동안 갇혀있었고 가짜 이주를 수행했고 다시 되돌아오는 것이 도움이 되었습니다.
첫 번째: 앱의 이전 마이그레이션을 찾습니다.
python manage.py showmigrations
예:
bz
[X] 0001_initial
[ ] 0002_bazifff
0002_bazifff 마이그레이션을 롤백하려면
python manage.py migrate bz 0001_initial
롤백 0001_initialOrall을 원하는 경우
python manage.py migrate bz zero
0001만 롤백할 수 없습니다.
이 답변은 Alasdair의 상위 답변이 도움이 되지 않는 유사한 경우에 대한 것입니다. (예: 새로운 마이그레이션마다 원치 않는 마이그레이션이 곧 다시 생성되거나, 다시 되돌릴 수 없는 더 큰 마이그레이션이거나 테이블을 수동으로 제거한 경우)
...새 마이그레이션을 만들지 않고 마이그레이션을 삭제하시겠습니까?
TL;DR: 마지막으로 되돌린(혼란스러운) 마이그레이션 몇 개를 삭제하고 모델을 수정한 후 새 마이그레이션을 만들 수 있습니다.또한 다른 방법을 사용하여 마이그레이션 명령으로 테이블을 생성하지 않도록 구성할 수 있습니다.현재 모델과 일치하도록 마지막 마이그레이션을 만들어야 합니다.
존재해야 하는 모델에 대한 테이블을 생성하지 않으려는 경우:
시스템 및 조건에 있는 데이터베이스에 이러한 테이블이 없어야 합니다.
- 시기: 다른 모델의 모델 상속 전용으로 생성된 기본 모델입니다.
- 솔루션:세트
class Meta: abstract = True
테이블은 다른 항목에 의해 또는 특별한 방법으로 수동으로 작성되는 경우가 거의 없습니다.
- 솔루션:사용하다
class Meta: managed = False
마이그레이션은 테스트에서만 생성되지만 사용되지는 않습니다.마이그레이션 파일이 중요합니다. 그렇지 않으면 복제 가능한 초기 상태에서 데이터베이스 테스트를 실행할 수 없습니다.
테이블은 일부 컴퓨터에서만 사용됩니다(예: 개발 중).
- 솔루션:특수 조건에서만 INSTALLED_APPs에 추가되는 새 애플리케이션으로 모델을 이동하거나 조건부를 사용합니다.
class Meta: managed = some_switch
.
프로젝트에서 여러 데이터베이스를 사용합니다.settings.DATABASES
- 솔루션:메소드를 사용하여 데이터베이스 라우터 쓰기
allow_migrate
테이블을 작성해야 하는 데이터베이스와 작성해야 하는 데이터베이스를 구분하기 위해.
마이그레이션은 모든 경우 A), B), C), D)에 Django 1.9+(및 B, C, D의 경우에만 Django 1.8)를 사용하여 생성되지만 적절한 경우에만 데이터베이스에 적용되거나 필요한 경우에는 적용되지 않을 수 있습니다.Django 1.8부터 테스트를 실행하기 위해 마이그레이션이 필요했습니다.관리되는 모델과 관리되는 모델 간에 ForeignKey를 만들거나 모델을 관리되는 모델=로 만들 수 있는 Django 1.9+의 managed=False가 있는 모델의 경우에도 마이그레이션에 의해 완전한 관련 현재 상태가 기록됩니다.정말 나중에.(이 질문은 장고 1.8 시점에 작성되었습니다.1.8에서 현재 2.2 사이의 버전에 대해서는 여기에 있는 모든 내용이 유효해야 합니다.)
마지막 마이그레이션을 쉽게 되돌릴 수 없는 경우(데이터베이스 백업 후) 신중하게 가짜 복구를 수행할 수 있습니다. ./manage.py migrate --fake my_app 0010_previous_migration
테이블을 수동으로 삭제합니다.
경우 구조를 합니다../manage.py migrate --fake my_app 0011_fixed_migration
.
djagno-nomad라고 불리는 좋은 도서관이 있지만, 질문과 직접적인 관련은 없지만, 이것을 공유하려고 생각했습니다.
시나리오: 대부분의 경우 프로젝트로 전환할 때 현재 분기에서 수행한 변경 사항을 되돌려야 한다고 생각합니다. 이것이 바로 이 라이브러리가 수행하는 작업입니다. 아래에서 확인하십시오.
https://pypi.org/project/django-nomad/
다른 모든 답변은 선형 마이그레이션 롤백에 적합합니다.그러나 마이그레이션이 비선형적인 경우(즉, 리프 노드가 여러 개 있고 하나의 경로만 롤백하려는 경우) 다음과 같은 방법으로 수행할 수 있습니다.
X
/ \
A B [A and B can represent any number of linear migrations.]
\ /
Y (merge migration)
A, B, Y를 롤백해야 한다면요.그러면 우리는 다른 대답들이 말하는 것처럼 할 수 있습니다.예python manage.py migrate app X
.
그러나 롤백 B 및 Y와 같은 하나의 경로만 적용 취소해야 하는 경우 다음 단계를 수행합니다.
- Y만 적용 해제합니다.를 으로써.
python manage.py migrate app B (or A; both works)
. - 프로젝트 위치에서 마이그레이션 파일 A 및 Y를 당분간 제거합니다.
- 이제 B를 적용 해제합니다.
python manage.py migrate app X
.
마이그레이션 파일 A 및 Y를 원래 위치로 가져옵니다.이제 적용되지 않은 마이그레이션 B 및 Y를 안전하게 삭제할 수 있습니다.
요점은 django는 파일이 위치에 있는 경우에만 마이그레이션을 롤백할 수 있습니다.마이그레이션 경로(예: 여기서 A)를 롤백하지 않으려면 롤백을 수행하는 동안 프로젝트 위치에서 해당 경로를 제거합니다.
이것에 대한 더 많은.https://stackoverflow.com/a/71231925/8663277
언급URL : https://stackoverflow.com/questions/32123477/how-to-revert-the-last-migration
'programing' 카테고리의 다른 글
내포된 f-스트링 (0) | 2023.05.19 |
---|---|
Git Bash가 내 경로를 보지 못합니다. (0) | 2023.05.19 |
git push -u가 무슨 뜻입니까? (0) | 2023.05.19 |
C# 또는 VB 설명서 주석에 굵은 글씨 또는 기울임꼴로 표시됩니까? (0) | 2023.05.19 |
변수 워크북 / 워크시트 vba 선언 (0) | 2023.05.19 |