Django 게시판 만들기 (2) - django mysql 연동 본문
- startproject했을 때 생기는 파일들
- mysite/ : 프로젝트를 담는 공간
- manage.py : django 프로젝트와 다양한 방법으로 상호작용 하는 커맨드라인의 유틸리티.
- config/ : 디렉토리 내부에 프로젝트를 위한 실제 python 패키지들이 저장된다. config.urls 와 같은 방식으로 프로젝트 어디서나 python 패키지들을 임포트할 수 있다.
- config/__init__.py : python에게 이 디렉토리를 패키지처럼 다루라고 알려주는 용도의 단순한 빈 파일
- config/settings.py : 현재 Django 프로젝트의 환경 및 구성을 저장한다.
- config/urls.py : 현재 Django 프로젝트의 URL선언을 저장한다. 프로젝트와 관련된 url을 이곳에 작성한다.
- config/asgi.py :
- ASGI는 당신의 Django 사이트에서 비동기 Python 기능과 비동기 Django 기능을 개발하면서 사용할 수 있게 해주는 새로운 비동기 친화적인 표준이다.
- config/wsgi.py : WSGI서버가 통신할 때 이 파일을 통해 장고 어플리케이션을 호출한다.
- WSGI는 웹 서버와 애플리케이션 간의 통신을 위한 주요 파이썬 표준이지만 동기식 코드만 지원한다
장고의 runserver로 서버를 운영할 때는 개발환경에서 사용하고 운영환경에서는 사용해서는 안된다.
- 앱 생성
- 앱은 장고 프로젝트에서 특정한 기능을 수행하는 웹 어플리케이션을 말한다. 프로젝트는 이러한 app들과 각 설정들을 모아둔 것이다.
- python manage.py startapp '앱이름' : 다음과 같은 명령으로 앱을 생성할 수 있다. 게시판을 만들것이므로 board라는 이름의 앱을 생성했다
- 뷰 생성
# board/views.py
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello world. you're at the board index.")
- 뷰를 호출하려면 이와 연결된 URL이 있어야 하는데, 이를 위해 URLconf가 사용된다.
- URLconf : URLconf는 장고에서 URL과 일치하는 뷰를 찾기 위한 패턴들의 집합이다.
- config/setting.py에 최상위 URLconf 모듈을 지정하고 Django서버로 http요청이 들어올 때마다, URLconf 매핑 List를 처음부터 끝까지 순차적으로 훝으며 검색한다. 매칭되는 url을 못찾았을 경우에는 404 응답을 발생시킨다.
- board 디렉터리에서 URLconf를 생성하려면 urls.py라는 파일을 생성해야 한다.
- URLconf : URLconf는 장고에서 URL과 일치하는 뷰를 찾기 위한 패턴들의 집합이다.
# board/urls.py
from django.urls import path
from . import views # . 현재 디렉터리를 의미
urlpatterns = [
path('', views.index, name='index'),
]
from . import views 의 의미는 현재 폴더에서 views를 가져오라는 뜻이다. 즉 board폴더에 있는 urls.py에서 같은 폴더에 있는 views.py를 가져오라는 뜻이다.
그 다음엔 최상위 URLconf에서 board/urls.py를 바라보게 설정해야 한다. 위처럼 똑같이 했을 경우에 runserver를 하고 127.0.0.1:8000을 입력했을 경우에는 우주선있는 페이지만 나올 것이다. board/urls.py를 작성했지만 최상위루트에서 찾지 못하고 있으므로 모르는 것.
# config/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('board/', include('board/urls')),
]
include() 함수는 다른 URLconf를 참조할 수 있도록 도와준다. include()를 만나면 url의 그 시점까지 일치하는 부분을 잘라내고, 남은 문자열 부분을 후속 처리를 위해 include된 URLconf로 전달한다.
-> path('board/', include('*앱/urls.py')) : url이 ~board/~일 경우에 *앱의 urls.py로 가서 매핑을 찾으라는 의미
- mysql 설치 및 연동
- mysql부터 설치를 한다 https://dev.mysql.com/downloads/windows/installer/ 여기서 밑에거 다운받아주면 된다
- https://m.blog.naver.com/c6369/220625848670 이곳에 있는 것처럼 따라하면 cmd에서 mysql 접속이 가능
- mysql -u root -p 입력을 하면 mysql 설치할때 입력했던 password 입력을 하고나면 mysql 접속 성공
- use 데이터베이스이름; 명령으로 데이터베이스 변경
- select user, host from user; 명령으로 사용자 조회
- create database 데이터베이스이름; 명령으로 db 생성
- show databases; 로 모든 db조회 가능
- https://velog.io/@taelee/mysql-user%ED%99%95%EC%9D%B8-%EB%B0%8F-%EC%B6%94%EA%B0%80 권한 추가 및 비번변경 등
- select database(); select user(); 현재 db, user 조회
- 테이블 생성
- mysql workbench에서 데이터베이스를 클릭하고 작성하고자 하는 테이블을 생성한다.
- python manage.py inspectdb 명령으로 해당 db에 존재하는 테이블들을 정리하며 출력해준다
- 작성한 테이블의 모델을 복사해서 models.py에 붙여 넣어주고 모델이 변경되었으니
- python manage.py makemigrations, python manage.py migrate
다른 방법으로도 모델을 작성하는 방법이 있는 것 같은데 아직 잘 모르겠어서 이 방법으로 모델을 구현했습니다. 혹시 다른 방법이 있다면 알려주시면 감사하겠습니다.
참고한 블로그 : https://hae-ong.tistory.com/25 (기존의 db를 연결하는 법)
https://velog.io/@devmin/Django-MySQL-Connect (django와 mysql 연결하기)
https://blog.naver.com/microfun/222590704820
- 슈퍼유저 생성
- python manage.py createsuperuser
- 관리 사이트에서 board app을 변경 가능하도록 만들기
# board/admin.py
from django.contrib import admin
from .models import Post
admin.site.register(Post)
※ 주의할 점 - 테이블 함부로 건드리지 마시오
테이블 수정한답시고 mysql workbench에서 필드 삭제했다가 admin페이지에서 필드하나 없다고 오류 내뱉는 경우를 조심하자.
나는 models.py를 수정하면 makemigrations 와 migrate를 해야한다! 하고 알고있었어서 models.py 에서 모델하나를 수정했다. 그리고나서 makemigrations와 migrate를 했는데 수정할 항목이 없다네? 어라?? 나는 분명 속성 하나를 지웠는데..? 이러고서 workbench가서 테이블 필드하나를 삭제했다. 그러고 admin페이지 와보니 "(너가 삭제한) 필드가 없잖아!!" 라고 오류를 주었다. 아무생각없이 막 건드리다간 이렇게 화를 부른다..
검색해보면서 이것저것 해보니 migration한거 다 지우고.. 또 makemigration을 하게 되었다. 이제 migrate를 할 차례지 하고 해보니 "님 그 테이블 이미 있음!" 하고 migrate를 안해주는 것이다.. 하하
이 문제의 해결방법을 찾아보니 테이블을 지운다(굉장히 위험한 방법, 데이터 다 날라가므로..)는 방법을 찾았다.
시작도 안한 초기 단계이고 스터디 목적의 과제이니 이 방법을 사용할 수 있지만, 아니라면 정말 백방으로 해결방법을 찾았을 것이다. 이 경험으로 db와 테이블 설계는 매우 중요하고 신중하게 해야 할 작업이라는 것을 느낄 수 있었다.
해결 방법 : workbench에서 테이블을 지운다. migrate를 한다(전에 makemigrations 한 파일이 있었음). workbench를 새로고침해서 테이블 생성이 되었는지 확인한다. admin페이지에서 모델을 건드릴 수 있는지 확인한다.
(저거 쓰느라 해결방법이 이게 다인지 고새 까먹었다.. 방법부터 먼저 쓸 걸ㅎ..)
- 앱 생성
- 앱 생성 시 config/settings.py에서 INSTALLED_APP 부분에 ex)'polls.apps.PollsConfig' 추가
- 앱이름Config 클래스는 앱/app.py 파일 내에 존재한다. 따라서 '앱.apps.앱이름Config' 를 추가한다
- 템플릿 디렉터리
- config/settings.py 에서 TEMPLATES = [ 부분에 'DIRS': [BASE_DIR / 'templates'] 추가
- model 삭제
- views.py나 forms.py에서 import 부분에서 모델명 제거
- 해당 모델의 migrations 폴더에서 __init__.py 빼고 다 삭제
- db에서 테이블 삭제 (이 부분은 순서상관X)
- db에서 django_migrations 부분을 조회하면 삭제하려는 모델 행이 나온다. 그 행 삭제 (필자의 경우 맨 마지막 줄에 0002_모델명 하고 있었음
- 만약 delete문이 이러한 오류가 뜨면서 행 삭제가 안된다면(You are using safe update mode), 다음 쿼리문 실행 > set sql_safe_updates=0;
- 다시 delete 명령으로 django_migrations의 해당 행 삭제
- python manage.py makemigrations 실행
- python manage.py migrate 실행
- 모델 삭제관련 참고 : https://hasiki.tistory.com/65
- delete문 오류관련 참고 : https://m.blog.naver.com/kkson50/221251167091
views.py 작성 -> urls.py 작성 -> .html 작성
'Programming > django' 카테고리의 다른 글
Django 게시판 만들기 (5) - 회원가입 구현 (0) | 2022.04.05 |
---|---|
Django 게시판 만들기 (4) - 글 수정/삭제 하기, 로그인 구현 (0) | 2022.04.03 |
Django 게시판 만들기 (3) - bootstrap 적용 (0) | 2022.04.01 |
Django 게시판 만들기 (1) - 개발환경 구축(가상환경, 장고 설치) (0) | 2022.03.31 |