> 백엔드 개발 > 파이썬 튜토리얼 > Django 프레임워크의 데이터 마이그레이션 기술(2부)

Django 프레임워크의 데이터 마이그레이션 기술(2부)

WBOY
풀어 주다: 2023-06-17 19:27:06
원래의
1321명이 탐색했습니다.

첫 번째 부분에서는 Django 프레임워크에서 데이터 마이그레이션의 기본 개념과 마이그레이션 생성 및 적용 방법을 소개했습니다. 이 문서에서는 데이터 마이그레이션 기술을 사용하여 몇 가지 일반적인 문제를 해결하는 방법을 살펴보겠습니다.

  1. 모델 필드 추가, 삭제 또는 수정

모델을 생성한 후 필드를 추가, 삭제 또는 수정하는 등 모델을 변경해야 하는 경우가 있습니다. Django에서는 마이그레이션을 생성하여 이를 수행합니다. 다음과 같은 모델이 있다고 가정해 보겠습니다.

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    email = models.EmailField()

    def __str__(self):
        return f"{self.first_name} {self.last_name}"
로그인 후 복사

이제 사람의 나이를 나타내기 위해 Person 모델에 age 필드를 추가하려고 합니다. 다음 명령을 실행할 수 있습니다:

python manage.py makemigrations --name add_age_field persons
로그인 후 복사

이렇게 하면 age 필드를 추가하는 작업이 포함된 새 마이그레이션 파일이 생성됩니다. 마이그레이션 파일의 작업을 수동으로 편집할 수 있습니다:

from django.db import migrations, models

class Migration(migrations.Migration):

    dependencies = [
        ('persons', '0001_initial'),
    ]

    operations = [
        migrations.AddField(
            model_name='person',
            name='age',
            field=models.IntegerField(null=True),
        ),
    ]
로그인 후 복사

그런 다음 새 마이그레이션을 적용합니다:

python manage.py migrate persons
로그인 후 복사
로그인 후 복사

이제 Person 모델에 age 필드가 있습니다.

필드를 삭제하거나 수정하려면 해당 작업을 마이그레이션 파일에 추가하면 됩니다.

  1. Merge migration

마이그레이션 파일을 수정해야 하는 경우 여러 마이그레이션 파일을 병합해야 할 수도 있습니다. Django는 마이그레이션 파일의 이름 순서에 따라 순차적으로 작업을 수행합니다. 따라서 이전 마이그레이션 파일이 수정되면 이후의 모든 마이그레이션 파일을 다시 생성해야 합니다. 대규모 프로젝트에서는 다시 생성해야 하는 마이그레이션 파일이 많을 수 있기 때문에 이는 문제가 됩니다. 이 문제를 해결하기 위해 "병합 마이그레이션" 기술을 사용할 수 있습니다.

먼저 새 마이그레이션 파일을 생성한 다음 병합할 모든 마이그레이션 파일을 이 파일의 종속성에 추가해야 합니다. 0001_initial과 0002_add_age_field라는 두 개의 마이그레이션 파일이 있고 이제 이 두 개의 마이그레이션 파일을 하나의 마이그레이션 파일로 병합하려고 한다고 가정합니다. 다음 명령을 실행할 수 있습니다:

python manage.py makemigrations --name merge persons --merge 0001_initial 0002_add_age_field
로그인 후 복사

이렇게 하면 0001_initial부터 0002_add_age_field까지 모든 내용을 포함하는 새 마이그레이션 파일이 생성됩니다. 이 파일을 수동으로 편집하여 작업을 확인하거나 수정할 수 있습니다. 그런 다음 새 마이그레이션을 적용합니다.

  1. 데이터 마이그레이션 버그 수정

데이터 마이그레이션 과정에서 가끔 오류가 발생할 수 있습니다. 예를 들어 일부 작업이 누락되거나 일부 작업으로 인해 데이터가 손실될 수 있습니다. 이러한 문제를 해결하기 위해 "패치 마이그레이션" 기술을 사용할 수 있습니다.

패치 마이그레이션은 일반 마이그레이션과 유사하지만 평소처럼 마이그레이션 파일을 생성하지 않고 데이터베이스를 직접 수정합니다. 마이그레이션 파일을 적용했는데 파일에 버그가 있다고 가정해 보겠습니다. 이제 이 버그를 수정하고 싶지만 새 마이그레이션 파일을 생성하고 싶지는 않습니다. 다음 명령을 실행할 수 있습니다:

python manage.py migrate persons 0002_patch
로그인 후 복사

그러면 0002_patch라는 새로운 마이그레이션이 실행됩니다. 이 마이그레이션에 복구 작업을 추가할 수 있습니다. 이러한 작업은 새 마이그레이션 파일을 생성하는 대신 데이터베이스를 직접 수정합니다.

  1. 데이터 마이그레이션을 사용하여 데이터 다시 로드

어떤 경우에는 데이터를 데이터베이스에 다시 로드해야 합니다. 예를 들어, 데이터베이스를 디버깅할 때 데이터베이스를 재설정하고 테스트 데이터를 다시 로드해야 할 수 있습니다. 이 목표를 달성하기 위해 "데이터 마이그레이션" 기술을 사용할 수 있습니다.

먼저, 데이터를 데이터베이스에 로드하려면 새 마이그레이션 파일을 생성하고 파일에 몇 가지 작업을 추가해야 합니다. 데이터베이스에 추가하려는 데이터가 포함된 json 파일이 있다고 가정합니다.

[
    {
        "first_name": "John",
        "last_name": "Doe",
        "email": "johndoe@example.com",
        "age": 30
    },
    {
        "first_name": "Jane",
        "last_name": "Doe",
        "email": "janedoe@example.com",
        "age": 25
    }
]
로그인 후 복사

마이그레이션 파일에서 이러한 개체를 생성하고 데이터베이스에 추가할 수 있습니다.

from django.core.management import call_command
from django.db import migrations
from persons.models import Person
import json

def load_data(apps, schema_editor):
    filename = 'path/to/data.json'
    with open(filename) as file:
        data = json.load(file)
        for item in data:
            Person.objects.create(**item)

class Migration(migrations.Migration):

    dependencies = [
        ('persons', '0002_add_age_field'),
    ]

    operations = [
        migrations.RunPython(load_data),
    ]
로그인 후 복사

이제 다음 명령을 실행할 수 있습니다. 데이터베이스에 데이터 로드:

python manage.py migrate persons
로그인 후 복사
로그인 후 복사

이렇게 하면 새 마이그레이션 파일이 적용되고 데이터베이스에 데이터가 추가됩니다.

요약

Django의 데이터 마이그레이션 기술을 사용하면 데이터베이스를 더 잘 관리하는 데 도움이 될 수 있습니다. 모델 필드를 추가, 삭제 또는 수정하고, 마이그레이션 파일을 병합하고, 마이그레이션 오류를 수정하고, 데이터를 다시 로드할 수 있습니다. 이러한 기술을 이해하면 복잡한 데이터베이스 작업을 더 쉽게 처리할 수 있습니다.

위 내용은 Django 프레임워크의 데이터 마이그레이션 기술(2부)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿