모델 생성과 migrate

model 테이블 생성하기

DB 테이블로 관리할 컨텐츠의 항목들을 MySQL에서 먼저 정의하고 이후에 model.py를 생성해 줄거에요. 테이블을 생성할 때는 MySQL 워크벤치에서 GUI를 이용해 편하게 하셔도 되고 아래에 올려드리는 SQL 스크립트를 실행하셔도 돼요. 각 항목들은 제가 임의로 결정한 것이니 자신의 필요에 맞게 바꾸셔도 된답니다!

CREATE TABLE `about` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `about_me` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `home_img` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `contact` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
  `username` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  `icon` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `c_url` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `domain` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title_kor` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  `title_eng` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
  `desc_kor` text COLLATE utf8_unicode_ci,
  `desc_eng` text COLLATE utf8_unicode_ci,
  `icon` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `experience_type` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `title` (`title`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `experience` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `start` date NOT NULL,
  `end` date DEFAULT NULL,
  `title_kor` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `title_enh` varchar(150) COLLATE utf8_unicode_ci DEFAULT NULL,
  `location_kor` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `location_eng` varchar(150) COLLATE utf8_unicode_ci NOT NULL,
  `desc_kor` longtext COLLATE utf8_unicode_ci NOT NULL,
  `desc_eng` longtext COLLATE utf8_unicode_ci,
  `ex_type` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `experience_c5c777d7` (`ex_type`),
  CONSTRAINT `experience_ex_type_6bb48d317f62021a_fk_experience_type_id` FOREIGN KEY (`ex_type`) REFERENCES `experience_type` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `project` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title_kor` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
  `title_eng` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  `title_img` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
  `date_start` date NOT NULL,
  `date_end` date DEFAULT NULL,
  `desc_kor` text COLLATE utf8_unicode_ci NOT NULL,
  `desc_eng` text COLLATE utf8_unicode_ci,
  `proj_url` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `publication_type` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `p_type` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `p_type` (`p_type`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `publication` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `p_date` date NOT NULL,
  `citation_kor` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `citation_eng` varchar(150) COLLATE utf8_unicode_ci DEFAULT NULL,
  `desc_kor` varchar(300) COLLATE utf8_unicode_ci DEFAULT NULL,
  `desc_eng` varchar(300) COLLATE utf8_unicode_ci DEFAULT NULL,
  `p_type` int(11) NOT NULL,
  `p_url` varchar(300) COLLATE utf8_unicode_ci,
  PRIMARY KEY (`id`),
  KEY `publication_ee532d29` (`p_type`),
  CONSTRAINT `publication_p_type_4497eeb232344f3f_fk_publication_type_id` FOREIGN KEY (`p_type`) REFERENCES `publication_type` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

넘어가기 전에 각 테이블의 설명을 간단히 적어드릴게요. 아래 컨텐츠 테이블 구성은 R&D 인력을 기본으로 하여 작성된 것이므로 자신의 직종에 따라 조금 변경될 수 있어요!

테이블 이름 설명
about 메인 사진, about 아래에 있는 설명 문단을 관리합니다
contact 나 자신의 각종 contact 정보를 관리합니다
domain 메인 페이지의 이름 아래 움직이는 텍스트, 나의 관심 분야(Job domain) 설명 등을 관리합니다
experience_type 학업, 직장, 수상 등 경력의 종류를 관리합니다
experience 학업, 직장, 수상 등 경력 사항을 관리합니다
project 프로젝트 기본 정보를 관리합니다
publication_type 학술논문, 단행본 등 출판물의 종류를 관리합니다
publication 학술논문, 단행본 등 출판물의 정보를 관리합니다

MySQL 테이블을 model로 가져오기

이제 생성한 MySQL 테이블 정보를 거꾸로 django model.py로 가져올 차례에요. 아래 명령어를 실행해주세요.

(django) ~/django$ python manage.py inspectdb > portfolio/models.py
(django) ~/django$ ls -al

ls -al의 결과로 해당 위치의 파일 목록이 보일 텐데 그 중 models.py라는 파일이 생성된 것을 확인할 수 있을 거에요! remote 서버와 local을 동기화시켜 진행하고 계신 분들은 이 파일을 꼭 local 환경으로 내려받기 해 주세요. 파일을 한번 열어 보면 대략 아래와 같은 모습일거에요. 'about' 테이블을 예로 하나 확인해볼까요?

class About(models.Model):
    about_me = models.CharField(max_length=255)
    home_img = models.CharField(max_length=45, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'about'

우리가 MySQL에서 먼저 정의했던 테이블 구조대로 django model 클래스가 자동 생성되었어요! 혹시 여기서 약간 손보고 싶은 부분이 있다면 수정해주세요.

그리고 여기서 하나 더 해 수정해주어야 하는 곳이 있는데, 각 클래스마다 Meta 안에 들어있는 magaged = False 이 부분을 True로 바꿔주세요! authentication 관련 자동 생성 클래스들이 많이 있을 텐데 다른 것들은 수정할 필요 없고 우리가 직접 생성한 테이블들만 True로 변경해주세요.

class About(models.Model):
    about_me = models.CharField(max_length=255)
    home_img = models.CharField(max_length=45, blank=True, null=True)

    class Meta:
        managed = True
        db_table = 'about'

managedFalse로 두면 스크립트에서의 변경 사항이 DB에 반영되지 않기 때문에 바꿔줍니다!

model migration

model.py가 변경되었으니 migration을 해 주어야 해요. 아래 명령어를 실행해서 migration 파일을 생성해주세요.

(django) ~/django$ python manage.py makemigrations
Migrations for 'portfolio':
  0001_initial.py:
    - Create model AuthGroup
    - Create model AuthGroupPermissions
    - Create model AuthPermission
    - Create model AuthUser
    - Create model AuthUserGroups
    - Create model AuthUserUserPermissions
    - Create model DjangoAdminLog
    - Create model DjangoContentType
    - Create model DjangoMigrations
    - Create model DjangoSession
    - Create model About
    - Create model Domain
    - Create model Experience
    - Create model ExperienceType
    - Create model Project
    - Create model Publication
    - Create model PublicationType
    - Add field p_type to publication
    - Add field ex_type to experience

형식적으로 아래 명령어도 실행해주세요. model.py 파일을 이용해서 데이터베이스에 테이블을 생성하거나 변경해주는 건데 우리는 DB 테이블을 먼저 생성해 두었기 때문에 No migrations to apply.라는 문구가 뜰 거에요!

(django) ~/django$ python manage.py migrate
Operations to perform:
  Synchronize unmigrated apps: staticfiles, messages
  Apply all migrations: admin, auth, contenttypes, sessions
Synchronizing apps without migrations:
  Creating tables...
    Running deferred SQL...
  Installing custom SQL...
Running migrations:
  No migrations to apply.

Reference

results matching ""

    No results matching ""