[Django] ORM & migration

장고에서 ORM(Object Relational Mapping)은 DB 관리를 위해서 반드시 알아두어야 할 상식이다. ORM은 전통적으로 우리가 DB를 관리하기 위해 DDL이나 DML을 직접 입력해 사용하던 것을 프로그래밍 언어를 통해 통일성 있게 작성해 주는 방법이다. DDL, DML을 이용할 경우 DB 관리자마다 사용하는 쿼리문들이 다르다. 그로 인해 검색 효율성 등이 떨어질 수 있다.(특히 나와 같이 미숙한 개발자들은..) 장고의 ORM을 이용하게 되면 우리는 이런 거 이런 거 만들어주세요! 하면 알아서 제일 효율적인 방법으로 만들고, 검색해준다.

ORM은 파이썬 장고에만 국한된 것이 아니라 다양한곳에 사용되고 있다.

 

장고 ORM의 경우 조금 불편한 점이 몇가지 있다면, 복합 키 구성이 안되고, PK FK 동시 적용하는 방법이 없다. class Meta를 생성하여 제한조건을 걸어 묶어두는 방법밖에 없다. 이런 몇 가지 단점을 제외하면, 정말 정말 편하게 DB를 관리할 수 있게 도와주는 천사 같은 존재다.

 

장고에서 DB에 테이블을 생성하는 과정은 크게 세 부분으로 나뉜다.

1. 모델 작성

2. makemigrations -> 파일로 저장

3. migrate -> table 생성

 

 

1. 모델 작성. PK는 반드시 하나만 지정할 수 있고, 만약 PK를 쓰지 않으면 정수 id가 PK로 자동으로 생성된다. (1, 2, 3, 4 ...)

from django.db import models


class UserData(models.Model):
    user_id = models.CharField(max_length=50)
    created_at = models.DateTimeField(auto_now_add=True)
    limit_speed = models.IntegerField()
    road_name = models.CharField(max_length=50)
    longitude = models.FloatField()
    latitude = models.FloatField()
    do_limit = models.IntegerField()

 

 

2. makemigrations 작성한 모델을 파일로 저장한다.

결과창을 보면 0001_어쩌구.py 가 생겼다고 뜨는 걸 볼 수 있다.

 

해당 파일을 확인해 보면 다음과 같이 무언가 만들어져 있다!

간략하게 살펴보면, dependencies는 의존성, 아마 외래 키 같은 것을 사용하면 써야 하는 부분인 듯하다.

name속성은 내가 models.py에 작성한 클래스 이름이고, fields는 레코드 타입(열) 같다.

# Generated by Django 4.0.3 on 2022-08-14 05:29

from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='UserData',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('user_id', models.CharField(max_length=50)),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('limit_speed', models.IntegerField()),
                ('road_name', models.CharField(max_length=50)),
                ('longitude', models.FloatField()),
                ('latitude', models.FloatField()),
                ('do_limit', models.IntegerField()),
            ],
        ),
    ]

 

 

3. migrate. 이제 이 파일을 이용해 테이블을 만들 수 있다.

무언가 왕창 만들어진 걸 볼 수 있다.

 

마지막에 보이는 0001을 제외하고는 장고가 기본적으로 필요한 테이블들을 자동으로 만들어주는 것 같다.

 

이제 내 DB를 확인해보면!

무려 12개의 테이블이 생성된 것을 볼 수 있다.

auth는 아마 인증에 관련된 것 같고,, 세션 테이블도 보인다. 자동으로 만들어주는 것들이 11개나 된다.

내가 만든 테이블은 base_userdata로 보인다.

주의할 점은 만약 모델을 변경할 경우 makemigrations와 migrate를 다시 적용해주어야 한다는 것이다.

바꾼 걸 적용시켜야 하기 때문에.. 그런데 이때 문제가 좀 많이 생긴다. PK를 바꾼다거나,, 의존성 문제가 있다거나.. 해결방법도 그때그때 다르니 일단 처음에 모델을 좀 완벽하게 만들어두자..