Skip to content

Django DatabaseTips #
Find similar titles

Structured data

Category
Programming

Database Tips #

Django 에서 Database 를 다룰 때의 여러가지 Tip들을 소개한다.

inspectdb 를 통해 현 데이터베이스에서 모델 가져오기 #

Django로 개발하면서 보통 모델을 models.py 에 정의하고 makemigrations & migrate 명령어를 통해 실제 database에 적용을 한다. 하지만 이미 만들어진 시스템을 Django로 바꾸거나 Django로 기능을 추가할 때 기존 DB에 접근하기 위해서는 models.py 를 기존 DB 모델로부터 정의를 해야한다. 간단한 구조라면 직접 정의를 하겠지만 규모가 크다면 models.py를 작성하는 것도 큰 일이 될 것이다. 이럴때 inspectdb 명령어를 통해 기존 DB로부터 DB 모델을 추출 할 수 있다.

사용법 #

settings.py에 Database 접속 정보를 정의한 후 아래 명령어를 통해 DB 모델을 추출한다.

python manage.py inspectdb > models.py

참고: https://docs.djangoproject.com/en/1.11/ref/django-admin/#django-admin-inspectdb

migration 시 특정 코드 실행하기 #

개발을 하면서 DB 모델을 수정하다 보면 migration이 실행될 때 특정 코드를 실행하고 싶을 때가 있다. 예를 들어 table에 C라는 column을 추가하면서 기존의 A, B 컬럼의 합을 C라는 컬럼에 값을 입력해야 한다고 하자. C라는 컬럼을 추가하면서 app/migrations/0002_auto_20160912_2353.py 와 같은 migration 파일이 만들어질텐데 이 파일은 이렇게 생겼다.

# -*- coding: utf-8 -*-
# Generated by Django 1.10 on 2017-11-22 23:06
from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ('app', '0001_initial.py'),
    ]

    operations = [
        migrations.AddField(
            model_name='test',
            name='number',
            field=models.IntegerField(blank=True, editable=False, null=True, verbose_name='Number'),
        ),
    ]

이 파일에 아래와 같이 실행할 함수를 정의하여 추가함으로써 migration시 특정 코드를 실행할 수 있다. operations 다음에 migrations.RunPython(실행할 함수)를 추가해주면 DB모델 변경 후에 함수를 실행해준다.

# -*- coding: utf-8 -*-
# Generated by Django 1.10 on 2017-11-22 23:06
from __future__ import unicode_literals

from django.db import migrations, models

def forwards_func(apps, schema_editor):
    mymodel = apps.get_model('app', 'test')
    for t in mymodel.objects.all():
        t.number = t.a + t.b
        t.save()

class Migration(migrations.Migration):

    dependencies = [
        ('app', '0001_initial.py'),
    ]

    operations = [
        migrations.AddField(
            model_name='test',
            name='number',
            field=models.IntegerField(blank=True, editable=False, null=True, verbose_name='Number'),
        ),
    migrations.RunPython(forwards_func),
    ]

Suggested Pages #

0.0.1_20140628_0