반원 블로그

django 모델(Model)과 데이터베이스 만들기 본문

2018~/Django 개인 공부 정리

django 모델(Model)과 데이터베이스 만들기

반원_SemiCircle 2019. 9. 3. 21:52

현재 fc_community프로젝트에 board와 fuser라는 app있는 상황

1.fuser에 모델을 만들어주려고 한다.(fuser.models.py)

from django.db import models

# Create your models here.


class Fuser(models.Model):  # models.Model를 상속
    username = models.CharField(max_length=64,
                                verbose_name='사용자명'  # admin 페이지에서 보일 컬럼명
                                )
    #5~7을 드래그 한뒤 Alt+Shift+Down하면 편함
    password = models.CharField(max_length=64,
                                verbose_name='비밀번호'  # admin 페이지에서 보일 컬럼명
                                )
    register_dttm = models.DateField(auto_now_add=True, # 자동으로 해당 시간이 추가됨
                                     verbose_name="가입날짜"
                                     )

    #별도로 테이블명을 지정하고 싶을 때 쓰는 코드(안해도 됨)
    class Meta:
        db_table = 'user_define_fuser_table' #테이블 명 지정

 

2. 마이그레이션 생성 - manage.py를 이용

프로젝트 폴더 위치에 가서 다음 명령어를 실행(맥이라면 python3)

python manage.py makemigration

(venv) PS C:\Storage\DjangoStudy01\fc_community> python .\manage.py makemigrations
Migrations for 'fuser':
  fuser\migrations\0001_initial.py
    - Create model Fuser

이러면 fuser앱 안의 migrations 폴더 안에 db를 어떻게 만들어야할지 models.py를 참조해서 만들어진 initial.py에 적혀있다.

3. 실제로 db 생성 명령어 - settings.py에 있던 앱들까지 생성된다.

python manage.py migrate

(venv) PS C:\Storage\DjangoStudy01\fc_community> python .\manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, fuser, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying fuser.0001_initial... OK
  Applying sessions.0001_initial... OK

4. settings.py에 있는 DATABASE를 참고하자

여기에 현재 프로젝트가 사용하는 DATABASE 세팅이 들어가며, 기본은 sqlite3로 잡혀있다.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

5. sqlite3로 만들어진 테이블을 확인하자.

그런데 sqlite3 명령어가 없으면 에러가 날 수 있다(윈도우) 그러니 sqlite3.exe를 따로준비하자. 설치링크 

해당 링크에서 Precompiled Binaries for WIndows 항목에서 3번째인

sqlite-tools-win32-x86-3290000.zip을 다운받아 안에 있는 sqlite3.exe를 프로젝트 폴더에 넣어두면 된다.

(venv) PS C:\Storage\DjangoStudy01\fc_community> .\sqlite3.exe .\db.sqlite3
SQLite version 3.29.0 2019-07-10 17:32:03
Enter ".help" for usage hints.
sqlite> .tables 
auth_group                  django_admin_log
auth_group_permissions      django_content_type       
auth_permission             django_migrations
auth_user                   django_session
auth_user_groups            user_define_fuser_table
auth_user_user_permissions

스키마를 확인해보면 자동으로 id(primary key 용도) 컬럼이 생성되고, 나머지는 생성한 모델에 맞게 구성되어있다.

sqlite> .schema user_define_fuser_table
CREATE TABLE IF NOT EXISTS "user_define_fuser_table" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "username" varchar(64) NOT NULL, "password" varchar(64) 
NOT NULL, "register_dttm" date NOT NULL);

sqlite를 나가려면 .q를 입력

 

6. 나중에 모델에서 정의한 필드가 바뀌면 다시 migrations만 하면 된다. 그러면 Alter(수정)이라는 명령구가 나온다. 만일 username의 max_length를 32로 바꾸고 저장한다음에 python manage.py migrations를 입력해보자.

from django.db import models

# Create your models here.


class Fuser(models.Model):  # models.Model를 상속
    username = models.CharField(max_length=32, ###64->32로 변경
                                verbose_name='사용자명'  # admin 페이지에서 보일 컬럼명
                                )
    #5~7을 드래그 한뒤 Alt+Shift+Down하면 편함
    password = models.CharField(max_length=64,
                                verbose_name='비밀번호'  # admin 페이지에서 보일 컬럼명
                                )
    register_dttm = models.DateField(auto_now_add=True, # 자동으로 해당 시간이 추가됨
                                     verbose_name="가입날짜"
                                     )

    #별도로 테이블명을 지정하고 싶을 때 쓰는 코드(안해도 됨)
    class Meta:
        db_table = 'user_define_fuser_table' #테이블 명 지정
(venv) PS C:\Storage\DjangoStudy01\fc_community> python .\manage.py makemigrations
Migrations for 'fuser':
  fuser\migrations\0002_auto_20190903_2342.py
    - Alter field username on fuser

 

Comments