DX Data School

데이터베이스 연동 2

Kim J 2024. 1. 30. 10:42

항상 우선적으로 작업하기 전 데이터베이스 접속 체크를 한다

도커에 MySQL 컨테이너가 작동하고 있는지 확인 후 DBeaver를 이용해 접속을 확인한다.

docker 컨테이너에 mysql Port 3306:3306 중 앞에오는 3306은 외부에서 접속할 때 포트이고, 뒤에 있는 3306은 내부에서 설정한 포트이다

빨간색이 외부, 노란색이 내부 ! 설정을 바꿀 수 있다.

> 데이터베이스 접속 정보

[1] 사용할 데이터베이스의 종류 : MySQL

[2] 데이터베이스 서버의 URL : localhost(127.0.0.1)

[3] 데이터베이스 서버의 포트 : 3306(MySQL 기본 포트)

[4] 데이터베이스 내에서 영역을 구분하기 위한 코드 : (MySQL의 경우 데이터베이스) : mysql

** [4]의 MySQL의 데이터베이스는 실제 데이터베이스가 아닌 영역을 의미.. Oracle 에서는 시드라고 한다. 클라이언트 영역을 구분할 수 있도록 정해둠

[5] 계정 : 관리자의 경우 root

[6] 비밀번호 : 안알랴줌 (그치만 꼭 설정 해야한다)

** MySQL 8.0의 경우 설정을 변경하지 않으면 비밀번호가 암호화되어 접속된다. 때에 따라 암호화를 해제해야 할 수도 있다.

** 필요에 따라 비밀번호가 필요하지 않을 수 있다.

> Django프로젝트 생성 및 기본설정 수정

어제 했던 거지만 복습을 슥 - 해보며 다시한다!

[1] 프로젝트를 저장할 디렉토리를 생성하고 프롬프트 이동

오늘 날짜로 슥슥 폴더 만들기

[2] 가상 환경 생성 및 활성화

- 애플리케이션 만들 때는 필수 그 이외의 경우는 생략가능

가상환경 생성 : python -m venv myvenv

가상환경 활성화 : myvenv\Scripts\activate

[3] 필요한 패키지 설치

설치는 터미널을 cmd로 바꾸고~

내가 지금 패키지는 django, mysqlclient 2개기 때문에 이렇게 써준다!

pip install django mysqlclient

[4] django 프로젝트 생성

django-admin startproject myproject .

- . 을 꼭 찍어줘야 한다! manage.py 파일과 myproject라는 디렉토리가 생성된다.

[5] django 애플리케이션 생성 - 반복수행 가능

python manage.py startapp myapp

[6] settings.py 파일을 수정 - 기본 설정

- 앱을 등록

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

- 데이터베이스 접속 정보 설정

DATABASES = {
   "default": {
         "ENGINE" : "django.db.backends.mysql",
         "NAME" : "dxjh", #데이터베이스 이름
         "USER" : "dxjh", #접속할 계정
         "PASSWORD" : , #비밀번호
         "HOST" : "127.0.0.1", #데이터베이스 접속위치
         "PORT" : "3306", #접속할 포트번호
     }
}

- 시간 대역 수정

TIME_ZONE = "Asia/Seoul"

[7] 데이터베이스 초기화

프로젝트를 처음 실행하기 전과 manage.py 파일을 수정한 경우 수행

python manage.py makemigrations

python manage.py migrate

[8] 관리자 계정 생성

관리자가 필요한 경우 수행 (이미 관리자를 생성 했으면 안해도 된다. 난 어제 해서 안해도 된당)

python manage.py createsuperuser

명령을 실행 시키면 ID, Email, Password 를 차례로 물어봐준다 하고싶은거 하면 된다. 친절도 하셔라~

[9] Django 프로젝트를 실행해서 웹 애플리케이션 구동

python manage.py runserver

- 이 경우는 127.0.0.1:8000 으로 접속

python manage.py runserver 127.0.0.1:80

- 이 경우는 127.0.0.1:80 으로 접속

python manage.py runserver 0.0.0.0:80

- 이 경우는 외부에서 이 컴퓨터의 IP로 접속이 되는데 배포할 때 사용

내 컴퓨터 IP 확인하는법 : cmd 실행 시키고 ipconfig 엔타!

[10] 웹에서 작동하는지 확인해본다~

오늘도 잘 되는구먼 껄껄껄.

여기까지가 어제의 복습!

오늘도 가보자고~


Model

1) django에서의Model

- 데이터베이스를 위한 Layer

애플리케이션 내의 models.py 파일에 작성한다.

moddels.py 파일에 모델 클래스를 만들 수 있는데 모델클래스 1개는 데이터베이스 테이블 1개와 매칭 된다. 모델 클래스를 만들 때는 django.db.models.Model 클래스를 상속 받아야 한다.

모델 클래스의 속성은 테이블 컬럼(필드, 속성 등)이 된다.

PK(Primary Key)를 설정하지 않으면 자동으로 id가 생성된다.

2) 속성의 타입

> CharField

일반 문자열로 max_langth 속성을 이용해 최대 길이를 설정해줘야 한다.

** EmailField, GenericlPAddressField, CommaSeparatedInetgetField, FilePathField, URLField 등 파생 클래스가 있다.

> TextField

긴 문자열

> IntegerField 정수

> DecimaField 실수

> BooleanField 참/거짓(true/false) 필드

> DateTimeField 날짜와 시간을 저장

> BinaryField

> FileField

> ImageField 이미지냐 아니냐 확인

> UUIDField 숫자와 문자로 만들어진 해시 값으로 어떤 값이 만들어질지 모름. 유일무이함

3) 필드 옵션 - 제약 조건

> null

> blank : null은 안된다. requried 만들 때 사용.

> primay key

> unique

> default

4) 모델 생성 및 적용

모델을 만들고 데이터베이스에 적용을 하게 되면 만들어지는 테이블이나 연결되는 테이블 이름은 앱이름_모델이름 이 된다.

데이터베이스에 테이블이 만들어져 있으면 연결을 하고 없으면

python manage.py migrate

명령으로 생성 가능하다.

> 자신의 app 디렉토리에 있는 models.py 파일에 작성

나는 오늘만든 app이 myapp 이니까 myapp/models.py 에 작성!

> 모델의 변경 내용을 데이터베이스에 적용

python manage.py makemigrations

python manage.py migrate

쭈룩쭈룩쭈루룩 뭔가 생성 됐다

> 데이터베이스에 myapp_Item이라는 테이블이 생성 됐는지 확인

show tables;

desc myapp_item;

완서엉~ 오늘은 졸음이 아니라 배고픔과의 싸움, 얼른 점심시간 됐으면 좋겠땅.

5) 샘플 데이터 삽입

아래의 샘플 데이터를 DBeaver에서 삽입 해보쟝

insert into myapp_item values(1, 'Lemon', 500, 'Vitamin-A', 'lemon.jpg', 10); 
insert into myapp_item values(2, 'Orange', 1500, 'Vitamin-B', 'orange.jpg', 20); 
insert into myapp_item values(3, 'Kiwi', 2000, 'Vitamin-C', 'kiwi.jpg', 15); 
insert into myapp_item values(4, 'Grape', 1000, 'Vitamin-D', 'grape.jpg', 25); 
insert into myapp_item values(5, 'Strawberry', 2000, 'Vitamin-E', 'strawberry.jpg', 30); 
insert into myapp_item values(6, 'Mandarin', 300, 'Vitamin-F', 'mandarin.jpg', 20); 

commit;

select * from myapp_item; << 요기까지 실행한 결과!

잘 들어갔다구

6) CRUD 작업 방법

> 삽입

모델 클래스를 가지고 객체를 생성하고 save()를 호출하면 삽입된다.

> 테이블의 전체 데이터 가져오기

모델클래스.object.all()를 호출하면 모델 객체의 cursor를 리턴한다.

> 하나의 데이터 가져오기

모델클래스.object.get(pk=기본키값)

> 조건에 맞는 데이터 가져오기

모델클래스.object.filter(속성이름 연산자 값)

> 조건에 맞는 않는 데이터 가져오기

모델클래스.object.exclude(속성이름 연산자 값)

> 기타

count()

order_by()

distinct()

first()

last()

> 수정 ( 찾아와서 수정한 뒤 저장 )

변수 = 모델클래스.object.get(pk=값)

변수.속성 = 값

변수.save()

** 있는거면 찾아와서 수정을 하지만 없으면 만들어서 저장 하는것을 upsert 라고 함.

> 삭제는 save 대신 delete()를 호출해 사용한다.

7) CRUD 실습

애플리케이션 views.py에 요청을 처리하는 함수를 만든다.

나는 myapp/views.py

프로젝트의 urls.py 파일에 url과 요청을 연결한다!

나는 myproject/urls.py

> 모든 데이터 가져오기

** views.py 파일에
def index(request):
    data = Item.objects.all() # 모든 데이터 가져오기
    return HttpResponse(data)

** urls.py 파일에
from myapp import views # myapp의 views 파일을 가져온다고 적어준다

urlpatterns = [
    path("admin/", admin.site.urls),
    path("", views.index), # 쉼표를 미리 적어둔다!
]

수정 했으면 서버를 구동하고 브라우저를 켜서 확인하면 끝!

속성없이 그냥 데이터 값만 딱 가져온거라 허접함 그 자체로 브라우저가 구성됐다 ㅎ.ㅎ

> 삽입

** views.py 파일에
def index(request):
    # 데이터 삽입
    # 모델 클래스에 인스턴스를 만들고 save라는 함수를 호출
    # Item 클래스의 인스턴스를 생성
    item = Item()
    item.itemid = 7
    item.itemname = "치즈돈까스"
    item.price = 8000
    item.description = "먹고싶어요"
    item.pictureurl = "없어용"
    item.amount = 10
    # save 호출
    item.save()
    data = Item.objects.all() # 모든 데이터 가져오기
    return HttpResponse(data)

DBeaver 테이블을 확인 해보면 위 내용이 들어간 것을 확인할 수 있다.

치즈돈까스 먹고싶어서 치즈돈까스임 점심에 치즈돈까스 먹을거임 아무튼 그럴 예정임

> 삭제

** views.py 파일에
def index(request):
      # delete 호출
      item.delete() # 삭제

으때요 증말 쉽죠?

나으,,, 치즈돈까스가,,, 사라졌습니다,,, 곧 ,,, 먹으러,,, 갈게 치돈아,,,

8) 전체 데이터 보기 구현

애플리케이션 views.py에 요청을 처리하는 함수를 만든다.

나는 myapp/views.py

애플리케이션 디렉토리 안에 html파일을 저장할 templates 디렉토리를 생성

나는 myapp/templates/test.html 을 만들면 된다.

** views.py 파일에
from myapp.models import Item

data = Item.objects.all() # item 클래스와 연결된 모든 데이터를 가져온다
return render(request, 'test.html', {'data' : data})
 # test.html 파일로 출력하는데 이 때 data라는 이름으로 data를 가져온다.

 

서버를 구동하고 html을 제대로 불러오는지 한번 본다.

잘 되는구나!

그렇다면 이제 저는 밥을 먹으러 가겠습니다

밥 맛있게 먹어요들 ~ 안냥~~~~~~~~~~~~~~~~~

'DX Data School' 카테고리의 다른 글

데이터베이스 연동 4  (0) 2024.04.01
데이터베이스 연동 3  (1) 2024.01.30
데이터베이스 연동  (0) 2024.01.30
Django 활용하여 Web Programming 실습 2  (0) 2024.01.30
Django 활용하여 Web Programming 실습  (2) 2024.01.30