Django
DatabaseTips
#
Find similar titles
- 최초 작성자
- 최근 업데이트
Structured data
- Category
- Programming
Table of Contents
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),
]