Django에서 데이터베이스에 대한 CRUD 기능이 구현되가끼자의 절차(과정)에 대해 정리해보자.
가상환경 생성 및 활성화
conda create -n project python=3.8
conda activate project
pip install django
pip install mysqlclient
project & application 생성
django-admin startproject 폴더 이름
python manage.py startapp app 이름
settings.py
의 INSTALLED_APS
에 추가Database 생성
mysql -u root -p
create database 데이터베이스 이름 character set utf8mb4 collate utf8mb4_general_ci;
show databases;
drop database 삭제할 데이터베이스 이름;
delete from 테이블 이름;
mysqldump -u [사용자아이디] -p 데이터베이스명 [테이블명] > 저장될 파일명
mysqldump -u root -p herhouse_pr > herhouse_dump.sql
mysqldump --column-statistics=0 -h [RDS 엔드포인트] -u [사용자아이디] -p 데이터베이스명 [테이블명] > 저장될 파일명
mysqldump --column-statistics=0 -h herhouse-database.cdsbia3f8w0i.us-east-2.rds.amazonaws.com -u root -p herhouse3 > herhouse_dump7.sql
mysqldump -u [사용자아이디] -p 데이터베이스명 --no-data > 저장될 파일명
mysqldump -u [사용자아이디] -p --no-create-info 데이터베이스명 > 저장될 파일명
mysql -h [RDS 엔드포인트] -u [사용자아이디] -p 데이터베이스명 < 덤프파일명.sql
settings.py 설정
IP 허용: ALLOWED_HOSTS = ['*']
(모든 사용자의 접속 허용)
주석 처리: admin
, auth
, CsrfViewMiddleware
, AuthenticationMiddleware
urls.py
에서 admin
관련 내용 제거(import된 모듈, path)
corsheaders 설치
Django-cors-headers란?
cors란?
CORS 란 웹브라우저에서 현재 사용자가 사용중인 사이트 이외에 동시에 다른 사이트에 접근하는 경우를 처리하기 위한 웹브라우저 표준기술이다. 웹브라우저 표준기술이기 때문에 브라우저가 이를 지원해야 한다.
cors가 나온 보안적 배경
설치 과정
패키지 설치: pip install django-cors-headers
APPS 추가: settings.py의 INSTALLD_APPS에 'corsheaders'
추가
middleware 추가: 'corsheaders.middleware.CorsMiddleware',
허용할 값 정의:
#REMOVE_APPEND_SLASH_WARNING
APPEND_SLASH = False
##CORS
CORS_ORIGIN_ALLOW_ALL=True
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOW_METHODS = (
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
)
CORS_ALLOW_HEADERS = (
'accept',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
#만약 허용해야할 추가적인 헤더키가 있다면?(사용자정의 키) 여기에 추가하면 됩니다.
)
Mysql database와 django 연동
개인정보가 git에 업로드되는 것을 막기 위해 manage.py
가 위치한 최상위 경로에 my_settings.py
생성
생성된 곳에 아래의 내용을 붙여넣은 뒤, 사용할 'Name'과 'PASSWORD'를 설정(PASSWORD는 mysql의 비밀번호와 일치해야 한다!)
DATABASES = {
'default' : {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'exercise',
'USER': 'root',
'PASSWORD': 'pass1423',
'HOST': 'localhost',
'PORT': '3306',
}
}
SECRET = {
'secret':'=6xvu3t)6+8k8vi@b-(g4=2ah$@vi*^f@h#fraf)mc-_3@xw8t',
}
Apple M1을 사용할 경우, 다음 작업이 추가적으로 요구된다.
pip install pymysql
pip install cryptography
my_settings.py 상단에 다음 내용을 입력
import pymysql
pymysql.install_as_MySQLdb()
settings.py에서 모듈 my_settings.py 불러오기
import my_settings
SECRET = my_settings.SECRET['secret']
으로 설정
SECRET
: 회원가입 시 비밀번호 암호화해준다.
debug = True
: 서버 에러 찍어주는 것. —> 불필요한 정보가 노출되기 때문에 배포 시에는 False로 설정해야 한다.
DATABASES = my_settings.DATABASES
mysql 테이블 삭제 후 django의 makemigrations
명령이 반영되지 않을 경우...
해당 앱에 있는 migrations 폴더 삭제, 단 __init__.py
파일을 제외하고 삭제하기!
데이터베이스에 직접 접속하여 테이블 중 django_migrations 라는 테이블에서 해당 앱에 대한 raw를 삭제.
DELETE FROM django_migrations WHERE app = '앱 이름'
python manage.py makemigrations
// python3 manage.py migrate
수행 하면 해결!!
혹시 python manage.py migrate
에서 오류가 발생하는 경우, python manage.py migrate --fake <앱이름>
실행하면 된다.
.gitignore 설정
.gitignore 설정이 필요한 이유
.gitignore
파일을 생성해서 관리해야 한다.설정 방법
cd '프로젝트 폴더명' (manage.py가 존재하는 디렉터리)
touch .gitignore
vi .gitignore
아래 두가지 추가
my_settings.py (보안 관련 파일은 github에 업로드되면 안됩니다.)
*.csv (crwaling한 파일 역시 업로드하지 않습니다.
# github에 업로드하고 싶지 않은 폴더가 있다면... 다음 형식으로 추가
파일이름/
ex) .idea/
models.py
에서 테이블 생성
class 1개 = 테이블 1개
class 이름은 단수 명사로 지정해야 한다.
models.DateTimeField(auto_now_add=True)
: 해당 컬럼의 데이터 생성 시 현재 시간 자동 저장
models.DateTimeField(auto_now=True)
: 해당 컬럼의 데이터 갱신 시 현재 시간 자동 저장
class Meta:
내부에서 변수 db_table
의 값을 할당하여 데이터베이스 상의 테이블 이름을 지정할 수 있다.
python manage.py makemigrations
python manage.py migrate
주의할 점
Pk(기본키) 특징: null값이 있으면 안되고 unique해야 함
컬럼(field)을 새롭게 추가했을 경우, 추가한 컬럼에 대한 데이터를 모두 넣어줘야 한다. 만약 넣어주지 않으면 에러가 밸상한다. 에러를 방지하려면 데이터를 전부 넣거나, null=True로 설정해야 한다.
사용중인 포트 찾아서, Kill 하기
lsof -i :포트번호
: 해당 포트번호를 사용중인 서비스가 있는지 확인하기sudo lsof -t -i tcp:8000 | xargs kill -9 PID번호
: 해당 PID 번호를 사용 중인 서비스가 있는 경우, 서비스를 종료한다.sudo lsof -t -i tcp:8000 | xargs kill -9
: 해당 포트 번호를 사용 중인 서비스가 있는 경우, 서비스를 종료한다.CRUD 기능을 구현한다는 것은 무슨 의미일까?
Python manage.py shell
: Django import되어 있기 때문에 원하는 내가 원하는 모듈, 클래스, 함수 등을 import할 수 있다.
ex) Product model import하기 —> from product.models import Product
메소드 리스트 확인 방법: class name.
입력 후 tab
키 누름
get, create, update, delete에 관한 메소드 리스트 확인 방법: class name.objects.
입력 후 tab
키 누름
대표적인 CRUD 메소드
class이름.objects.all()
: 전체 데이터를 쿼리셋 형태로 가져옴
class이름.objects.create(name=’사과’)
: 데이터 생성
a = class이름(필드명='')
: 데이터 생성(클래스 인스턴스 객체 생성 방법) ▶ a.save()
로 저장해야 한다.
class이름.objects.get(필드명='')
: 데이터를 오직 한 개만 불러오기 때문에 괄호 안에 조건 입력이 필수
class이름.objects.filter(필드명='')
: 조건에 해당하는 데이터를 쿼리셋 형태로 불러옴
class이름.objects.values()
: 데이터 내용이 list 안의 dict 형식으로 출력
a = Product.objects.get(id=1)
로 할당 ▶ a.name
—> 특정 필드 데이터에 접근
b = Product.filter(id=1)
로 할당 ▶ 쿼리셋은 list형식 데이터므로, 인덱싱으로 접근 ▶ b[0].name
—> 특정 필드 데이터에 접근
a = Product.objects.get(id=1)
로 할당 ▶ a.name = ‘귤’
▶ a.save()
—> 데이터가 수정됨
class이름.objects.get(필드명='').delete()
: 데이터 삭제(쿼리셋 객체와 일반 객체 모두에 적용된다.)
class이름.objects.filter().update(필드명='')
—> update()
는 쿼리셋 객체에 대해서만 적용 가능하다
Mysql에서 테이블 확인하기
mysql -u root -p
use 데이터베이스 이름
현재 DB의 테이블 목록 출력: show tables;
테이블 구조 확인: desc 테이블 이름;
테이블에서 데이터 출력: select * from 테이블 이름;