본문 바로가기
프로그래밍/Python

파이썬 웹프로그래밍 - 장고(Django) 튜토리얼 1(MySQL, MariaDB 연동)

by pentode 2018. 4. 9.

이 내용은 장고(Django) 튜토리얼 https://docs.djangoproject.com/en/1.11/intro/ 을 정리한 내용 입니다. 이전 "파이썬 웹프로그래밍 - 장고(Django)설치" 에서 Django 를 설치하고, 명령행으로 사이트를 작성하고 실행하는 방법을 보았습니다. 이제부터 튜토리얼 내용을 하나씩 따라해 볼텐데, 여기서는 Eclipse와  PyDev 를 사용해서 애플리케이션을 작성하고 실행해 보겠습니다.

 

 

1. 프로젝트를 생성하고 실행해 봅니다.

프로젝트 생성까지의 이미지는 "장고(Django)설치"를 참조해 주십시오.

 

1.1. 이클립스 메뉴에서 File -> New -> Project... 를 선택합니다. PyDev -> PyDev Django Project를 선택하고 "Next" 버튼을 누릅니다.

 

1.2. Create a new Pydev Django Project.

프로젝트 생성창에서 각 항목에 다음과 같이 있력하고, "Next" 버튼을 누릅니다.

 

- Project name : mysite

- Project contents : Use default 체크

- Choose the project type : Python 체크

- Grammar Version : 3.6

- Interpreter : 3.6

- Add project directory to the PYTHONPATH 체크

 

1.3. Reference page에서 다른 참조 프로젝트를 선택할 수 있는데 아무것도 선택하지 않고, "Next"를 누릅니다.

 

1.4. Basic Django Settings

Django version: 1.4 or later 를 선택합니다. 데이터베이스 설정은 현재 그대로 둡니다. "Finish" 버튼을 누릅니다.

 

이 프로젝트의 생성은 명령 프롬프트에서 다음 명령을 사용해서 수행할 수 있습니다. 

 

C:\workspace\python>django-admin startproject mysite

 

1.5. 설문조사 애플리케이션 추가하기

프로젝트명에 마우스 오른쪽키를 눌러서 Django -> Create application (manage.py startapp)을 선택합니다. 팝업창에서 polls 를 입력합니다.

 

Django Create application

 

이 과정은 명령 프롬프트에서 다음 명령을 수행해서 생성 합니다. 

 

C:\workspace\python\mysite>python manage.py startapp polls

 

 

 

1.6. 설문조사 애플리케이션의 초기화면을 만듭니다.

첫 번째로 view 파일을 작성합니다. /mysite/polls/views.py 파일 입니다. 

 

from django.http import HttpResponse

def index(request):
    return HttpResponse("설문조사의 인덱스 위치 입니다.")

 

두 번째로 polls 애플리케이션의 /mysite/polls/urls.py 파일을 생성합니다. 

 

from django.conf.urls import url
from . import views

urlpatterns = [
	url(r'^$', views.index, name='index'),
]

 

- Django 2.0에서는 path 함수를 사용하는 것으로 변경되었습니다.

 

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

 

세 번째로 root 의 /mysite/urls.py 파일을 수정합니다. 수정 내용은 polls/ 로 요청이 들어오면 polls.urls 를 실행하도록 하는 것입니다. 

 

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
	url(r'^polls/', include('polls.urls')),
	url(r'^admin/', admin.site.urls),
]

 

- Django 2.0에서는 path 함수를 사용하는 것으로 변경되었습니다.

 

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]

 

 

1.7. 애플리케이션을 실행해 봅니다.

프로젝트명에 마우스 오른쪽 키를 누르고, Run As  -> PyDev: Django 를 선택하여 서버를 실행합니다. 브라우저에서 http://127.0.0.1:8000/polls 로 요청합니다.

 

장고 기본 실행

 

여기까지가 앞에서 장고(Django)를 설치하고 간단한 화면을 출력해본 것 까지를 이클립스 PyDev로 실행해 본 것입니다. 이제는 계속 나아가기 위해서 Django 를 MySQL과 연동을 해보겠습니다.

 

 

2. 장고(Django) 데이터베이스(MySQL, MariaDB)와 연동하기

기본적으로 Python에는 sqlite 가 포함되어 있습니다. 따로 설치하지 않아도 바로 사용할 수 있습니다. 하지만 여기서는 MySQL을 사용해보겠습니다. 실제는 MariaDB 가 되겠습니다. 데이터베이스의 설치는 "Windows용 XAMPP 설치하기 - (Apache, PHP, MariaDB)"  에서 설치한 MariaDB를 사용하겠습니다.

 

 

2.1. 테스트용 데이터베이스 생성하기

명령행 툴로 설문조사 애플리케이션에서 사용할 데이터베이스를 생성합니다. 

 

MariaDB [(none)]> CREATE DATABASE pollsdb;
MariaDB [(none)]> GRANT ALL ON pollsdb.* TO 'pollsdbadm'@'localhost' IDENTIFIED BY 'pollsdbadm';
MariaDB [(none)]> FLUSH PRIVILEGES;

 

2.2. MySQL 드라이버를 설치합니다.

드라이브 관련 정보는 다음 URL에서 찾아볼 수 있습니다. Python 버전에 따라 다른 드라이버를 선택할 수 있습니다.

 

https://docs.djangoproject.com/en/1.11/ref/databases/#mysql-db-api-drivers

 

Pyhton 3 이상의 버전에서는 mysqlclient 드라이버를 사용할 수 있습니다. 다음 URL에서 다운 받을 수 있습니다.

 

https://pypi.python.org/pypi/mysqlclient

 

드라이버를 설치합니다.

 

pip install mysqlclient-1.3.10-cp36-cp36m-win32.whl

 

장고 MySQL 드라이버 설치

 

 

 

 

2.3. 데이터베이스 연동하기

 

※ Django 2.0 으로 업그레이드 되고 설정방법이 변경되었습니다. 2.0에서의 설정방법을 먼저 알아봅니다. mysite/settings.py 파일만 아래와 같이 수정하면 됩니다.

 

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'pollsdb',
        'USER': 'pollsdbadm',
        'PASSWORD': 'pollsdbadm',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    },
}

 

※ 아래는 Django 1.11에서의 연동방법입니다. 

이제 데이터베이스가 만들어지고, 드라이버도 설치되었으니 둘을 연동해 보겠습니다. mysite/settings.py 파일에서 데이터베이스 부분을 수정합니다. 

 

DATABASES = {
	'default': {
		'ENGINE': 'django.db.backends.mysql',
		'OPTIONS': {
			'read_default_file': os.path.join(BASE_DIR, 'my.cnf'),
		},
	}
}

 

데이터베이스 연결정보를 가지고 있는 mysite/my.cnf 파일을 만듭니다.

 

[client]
database = pollsdb
user = pollsdbadm
password = pollsdbadm
default-character-set = utf8

 

이것으로 데이터베이스 연동에 필요한 작업이 모두 완료되었습니다.

 

 

2.4 기본 애플리케이션들이 변경된 데이터베이스를 사용하도록 수정합니다.

장고(Django) 사이트를 생성하면 기본적으로 설치되는 애플리케이션들이 있습니다. mysite/settings.py 파일내에 정의되어 있으며 다음과 같습니다.

 

INSTALLED_APPS = [
	'django.contrib.admin',
	'django.contrib.auth',
	'django.contrib.contenttypes',
	'django.contrib.sessions',
	'django.contrib.messages',
	'django.contrib.staticfiles',
]

 

- django.contrib.admin : 관리 사이트 입니다.

- django.contrib.auth : 인증 시스템 입니다.

- django.contrib.contenttypes : 컨텐츠 타입 프레임웍 입니다.

- django.contrib.sessions : 세션 프레임웍 입니다.

- django.contrib.messages : 메세징 프레임웍 입니다.

- django.contrib.staticfiles : 정적 파일을 관리하는 프레임웍 입니다.

 

 

이러한 기본 애플리케이션은 데이터베이스를 사용하고 있는 것이 있으므로 기존의 sqlite 에서 바뀐 MySQL을 사용하도록 migration 합니다.

 

프로젝트명에 마우스 오른쪽키를 누르고, Django -> Migrage (Django >= 1.7)(manage.py migrate) 를 실행합니다. 실행결과가 아래와 같이 Console 창에 보여집니다.

 

Operations to perform:
	Apply all migrations: admin, auth, contenttypes, 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 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 sessions.0001_initial... OK
Finished "C:\workspace\workspace_neon\mysite\manage.py migrate" execution.

 

2.5. 설문조사 애플리케이션을 위한 모델을 생성 합니다.

모델은 설문조사 애플리케이션에서 사용되는 테이블 객체들을 나타내는 클래스입니다. 모델이 생성되면 이 모델로부터 데이터 테이블을 자동으로 생성하게 됩니다.

 

mysite/polls/models.py 파일을 수정합니다.

 

from django.db import models

# Create your models here.
class Question(models.Model):
	question_text = models.CharField(max_length=200)
	pub_date = models.DateTimeField('date published')

class Choice(models.Model):
	question = models.ForeignKey(Question, on_delete=models.CASCADE)
	choice_text = models.CharField(max_length=200)
	votes = models.IntegerField(default=0)

 

이 파일에는 Question 클래스와 Choice 클래스가 정의되어 있습니다. 둘은 1:다 관계로 질문과 질문에 속한 답변 항목을 나타내는 클래스 입니다.

 

모델에 관해서는 다음 URL을 참조하세요.

 

- 모델 인스턴스 레퍼런스 : https://docs.djangoproject.com/en/1.11/ref/models/instances/#django.db.models.Model

- 모델(필드 타입 등) : https://docs.djangoproject.com/en/1.11/topics/db/models/

- 데이터베이스 쿼리 : https://docs.djangoproject.com/en/1.11/topics/db/queries/https://docs.djangoproject.com/en/1.11/topics/db/queries/

 

 

2.6. 애플리케이션 활성화

장고(Django)에게 설문조사 애플리케이션을 알려서 Question, Choice 데이터베이스 생성 및 데이터베이스 액세스 객체를 생성할 수 있게 합니다. 설정파일에 애플리케이션을 추가 합니다. mysite/settings.py

 

INSTALLED_APPS = [
	'polls.apps.PollsConfig',
	'django.contrib.admin',
	'django.contrib.auth',
	'django.contrib.contenttypes',
	'django.contrib.sessions',
	'django.contrib.messages',
	'django.contrib.staticfiles',
]

 

이제 다음 명령으로 polls 애플리케이션이 데이터베이스를 생성하기 위한 초기 파일을 생성합니다. 다음 명령은 장고(Django)에게 모델에 변경된 것이 있다는 것을 알립니다. mysite/polls/migrations/0001_initial.py 파일이 생성됩니다.

 

프로젝트명에 마우스 오른쪽 키를 누르고, Django -> Make Migrations (Django >= 1.7) (manage.py makemigrations) 를 실행합니다.

 

Migrations for 'polls':
	polls\migrations\0001_initial.py
		- Create model Choice
		- Create model Question
		- Add field question to choice
Finished "C:\workspace\workspace_neon\mysite\manage.py makemigrations polls" execution.

 

2.7. 이제 실행되어질 SQL 문장을 확인해 봅니다.

프로젝트명에 마우스 오른쪽 키를 누르고, Django -> Custom command (manage.py ${custom_command}) 를 선택합니다. 명령어 입력창이 뜨면 sqlmigrate polls 0001 를 입력하고, "OK"를 눌러 실행합니다. sqlmigrate 명령으로 model이 마이그레이션 될때 실행될 SQL 문장을 확인할 수 있습니다.

 

데이터베이스 마이그레이션

 

데이터베이스에 따라 다르겠지만, 다음과 같은 출력이 보여질 것입니다.

 

BEGIN;
--
-- Create model Choice
--
CREATE TABLE `polls_choice` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `choice_text` varchar(200) NOT NULL, `votes` integer NOT NULL);
--
-- Create model Question
--
CREATE TABLE `polls_question` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `question_text` varchar(200) NOT NULL, `pub_date` datetime(6) NOT NULL);
--
-- Add field question to choice
--
ALTER TABLE `polls_choice` ADD COLUMN `question_id` integer NOT NULL;
ALTER TABLE `polls_choice` ADD CONSTRAINT `polls_choice_question_id_c5b4b260_fk_polls_question_id` FOREIGN KEY (`question_id`) REFERENCES `polls_question` (`id`);
COMMIT;
Finished "C:\workspace\workspace_neon\mysite\manage.py sqlmigrate polls 0001" execution.

 

2.8. 다시 migrate 명령을 수행해서 데이터베이스를 생성합니다.

프로젝트명에 마우스 오른쪽키를 누르고, Django -> Migrage (Django >= 1.7)(manage.py migrate) 를 실행합니다.

 

Operations to perform:
	Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
	Applying polls.0001_initial... OK
Finished "C:\workspace\workspace_neon\mysite\manage.py migrate" execution.

 

mysql 툴로 생성된 데이블을 확인합니다.

 

mysql명령으로 변경 확인

 

여기까지 해서 MariaDB 연동 후 테이블 생성까지 알아보았습니다.

 

반응형