백엔드/django

[SGC]04_데이터베이스(ORM)

묘걍 2024. 1. 30. 17:16

👉🏻 ORM

  • SQL
    • Oracle, MySQL 등의 DB를 쓸 때는 DB를 다루는 쿼리문
    • read, update, delete, modify ... 등
  • Django는 이 SQL을 래핑해서
    바깥에서 함수나 메서드를 이용해 안에 있는 SQL문이 실행될 수 있도록 만들었다
    • 이것이 ORM
  • 프로그래밍에서 함수나 클래스 안의 메서드를 호출해서 쓰듯
    ORM에 정의되어있는 함수나 메서드를 활용한다
  • 내부적으로 알아서 함수가 SQL문을 실행해서
    테이블 생성, 데이터 삽입/삭제/수정 등의 작업을 수행할 수 있다

👉🏻 프로젝트 생성하고 기본설정하기

🎮 프로젝트 생성하기

  • 프로젝트를 생성할 디렉토리 안에서 해당 명령어 입력

  • 생성됨

명령 프롬프트에서 해당 폴더로 이동한 뒤 dir을 찍어보면

  • manage.py, tempPjt폴더가 있다

🎮 애플리케이션 만들기

  • 프로젝트 내에서 위 명령어를 통해 앱을 만들 수 있다

  • 생성됨
  • 기본 생성되어야하는 폴더나 파일은 장고가 알아서 만들어준다

🎮 프로젝트명과 기본 폴더 이름 다르게하기

  • 프로젝트가 들어있는 폴더로 올라가서
  • 해당 명령어를 입력

🎮 애플리케이션 등록하기

  • 전체 설정파일(settings.py)에 INSTALLED_APPS에 추가해야
    비로소 그 프로젝트에서 다른 애플리케이션과 연결되는 애플리케이션에 등록된다?

  • 애플리케이션의 이름은 풀네임을 모두 써주는 것이 좋다

apps.py에 보면 class명이 정의되어있다

이걸 그대로 가져다 쓰면 된다

이렇게 추가

더보기

🤔 예전에 배울 때는 앱 이름만 적었던 것 같은데..

"MyApp.apps.MyAppConfig"와 같이 앱의 설정 클래스를 INSTALLED_APPS에 추가하는 경우는 일반적으로 몇 가지 이유로 인해 사용됩니다. 이것은 Django에서 앱 설정을 불러오고 초기화하는 방법을 명시적으로 지정하는 것입니다.

  1. 명시적인 앱 설정 지정:
    • INSTALLED_APPS에 앱을 추가할 때, 해당 앱의 AppConfig 클래스를 직접 지정함으로써 앱의 설정을 명시적으로 지정할 수 있습니다. 이는 Django가 앱을 로드하고 초기화할 때 특정한 설정을 사용하도록 강제하는 방법입니다.
  2. 앱 설정 클래스에 추가적인 설정 가능:
    • 앱의 설정 클래스는 AppConfig를 상속받아 만들어지며, 이 클래스에 추가적인 설정을 정의할 수 있습니다. AppConfig 클래스를 사용하면 앱이나 모델 등의 초기화 코드를 추가할 수 있습니다.
  3. 앱의 별칭 제공:
    • 이 방법을 사용하면 앱에 대한 별칭을 제공할 수 있습니다. 예를 들어, MyApp.apps.MyAppConfig 대신에 myapp만 쓸 수 있도록 설정할 수 있습니다.

예를 들어, 다음과 같이 settings.py에서 INSTALLED_APPS에 추가할 수 있습니다:

# settings.py

INSTALLED_APPS = [
    # 다른 앱들...
    'myapp.apps.MyAppConfig',
    # 다른 앱들...
]

여기서 'myapp.apps.MyAppConfig'는 'myapp' 앱의 설정 클래스를 나타냅니다. 이렇게 하면 Django는 해당 앱을 로드하고, MyAppConfig 클래스를 사용하여 초기화합니다. 이는 Django의 기본 동작을 오버라이드하거나 특별한 설정을 추가하고자 할 때 유용합니다.


  1. MyApp으로 등록:
    • 간편성: 단순히 "MyApp"만을 INSTALLED_APPS에 추가하는 경우, Django는 앱의 기본 설정을 사용하여 초기화합니다. 대부분의 경우에는 이 기본 설정으로 충분하며, 별다른 추가 설정이 필요하지 않을 때 사용됩니다.
    • 앱 이름만으로 인식: Django는 앱의 이름만을 사용하여 해당 앱을 인식하고 초기화합니다. 그러나 앱 설정 클래스에 추가적인 설정이 필요한 경우에는 이 방법으로는 부족할 수 있습니다.
  2. MyApp.apps.MyAppConfig으로 등록:
    • 명시적 설정 가능: "MyApp.apps.MyAppConfig"로 등록하는 경우, Django에게 앱의 설정을 명시적으로 지정합니다. 앱 설정 클래스에 추가적인 설정이나 로직이 있다면 이를 활용할 수 있습니다.
    • 앱 설정 클래스 사용: 이 방법으로 등록하면 MyAppConfig 클래스의 코드가 실행되어 해당 앱에 대한 추가적인 초기화를 수행할 수 있습니다.

따라서 "MyApp"으로 등록하는 것은 간편하게 앱을 추가하는 방법이며, 대부분의 경우에는 충분합니다. 반면에 "MyApp.apps.MyAppConfig"로 등록하는 것은 앱에 대한 더 많은 제어와 설정을 가능하게 합니다. 선택은 프로젝트의 요구사항과 개발자의 선호도에 따라 다를 수 있습니다.

🎮 기본 사용자 및 그룹 테이블 생성

  • Django의 migrations 시스템을 통해 데이터베이스 스키마를 관리하고 업데이트하는 데 사용됨
  • django.contirb.auth앱에 정의되어 있다

✅ 관리자 계정 만들기

  • 위 명령어를 입력하고 나오는 항목들에 기입만 하면 된다

 

✅ 서버 실행하기

  • 관리자 화면으로 들어가기 위해 서버를 실행해야 한다
  • 새로운 명령프롬프트를 열어서 작업한다
    • 서버 관련 로그가 (실시간으로) 모두 여기 찍힐 것

  • 프로젝트 디렉토리에서 명령어 입력
  • 8000번 port 명시

  • 이렇게 나오면 실행된 것

서버에 접근해보면

이렇게 기본 화면이 잘 나온다

서버에 로그도 찍히고 있음

뒤에 /admin을 붙여 관리자모드로 들어가

로그인을 하면

기본 사용자 및 그룹을 만들었기 때문에 그룹과 사용자가 이미 하나씩 만들어져 있다

 

👉🏻 테이블 생성

🧩 방법

models.py에 테이블 클래스 정의 후 admin.p에 등록한다

✅ 테이블 클래스 정의하기

출처: SEOUL G-캠프 유튜브

  • models.py에 클래스를 만든다
    • student와 관련된 테이블을 만들고 싶으면 Student클래스를 만든다
    • student.Model이라는 클래스를 상속받는다
  • 속성을 정해준다
    • 속성 = 테이블의 필드 (s_name, s_major ...)
    • 속성을 정의할 때는 데이터타입을 명시해준다
    • 데이터의 최대 길이나 디폴트값도 명시해준다
  • __str__메서드
    • 클래스를 만듦으로써 테이블이 생성됨
    • 클래스 만든 뒤에는 반드시 __str__메서드를 만들어줘야한다
    • 외부에서 이 클래스에 접근할 때 테이블의 이름을 반환해서 어떤 테이블인지 쉽게 알아볼 수 있다
    • 해당 모델 인스턴스를 표현하는 문자열을 반환하는 것
      모델 객체를 외부에서 출력할 때 이 메서드가 호출되어 해당 모델의 정보를 쉽게 확인할 수 있다
    • Student 객체가 문자열로 표현될 때 어떻게 보여질지 → name을 반환하도록 정의한 것
    • 모델을 사용할 때, 사용자가 student 객체를 출력하거나 로그에 남길 때 __str__메서드가 호출된다

🎮 실습

  • class를 만듦으로써 DB에 테이블을 만든 것
  • 클래스는 models 클래스를 상속해서 만듦
  • 클래스의 속성은 테이블의 필드 이름
  • 속성을 정의할 때는 데이터타입과 데이터 길이도 명시해준다
  • str메서드를 넣어줘야 클래스를 완벽한 하나의 테이블로 적용 가능하다

✅ admin에 등록하기

출처: SEOUL G-캠프 유튜브

🎮 실습

  • 모델의 클래스(Student)를 등록해줘야한다
  • 앱 디렉토리의 models.py 에 있는 Student 클래스를 가져와라
  • 사이트에 Student를 등록하는 것
    • 관리자모드에서 테이블 데이터베이스가 보여진다

✅ 변경사항 마이그레이션

출처: SEOUL G-캠프 유튜브

  • DB에 변경이 있었던 것이기 때문에 위 명령어로 변경사항을 migrate 한다

🎮 실습

(서버 켜 둔 명령어프롬프트 아니고 원래 작업하던 창!!)

  • 변경사항이 있는지 확인하기

  • 변경사항이 하나 있다고 나옴

  • 변경사항 적용하기

  • 적용됨

관리자 페이지에서도 확인 가능

안에는 아무런 데이터가 없다

데이터 생성을 안 했으니까!

 

👉🏻 레코드 다루기

🎮 Django shell모드 실행

  • python shell과 같다고 생각하면 된다

shell모드로 진입

🧩 데이터 추가

  • 패키지와 모듈을 가져온다
    • 클래스 import
  • Student 클래스에 레코드를 추가하기
    • query string이라는 변수를 만들어 속성마다 값을 넣어준다
    • Student 클래스를 생성하는데 그 안에 속성값을 기본적으로 넣어준 것(?)
  • 아직은 데이터베이스에 반영되기 전, 메모리에만 올라갔다
  • 이것을 DB에 반영하기 위해 query string 변수의 save메서드를 호출해주어야 한다

관리자 페이지에서 확인해보면

Student안에 홍길동이 추가되어 있다

홍길동 안의 내용들

  • 다른 레코드 더 추가

총 3명의 데이터가 추가된 것을 볼 수 있다

🧩 데이터 검색

✅ 데이터 전체

QuerySet 타입으로 변환

  • .objects.all()을 통해 데이터 전체를 가져올 수 있다

  • 변수에 넣을 수 도 있다

  • 타입을 출력해보면 QuerySet으로 나온다
  • 데이터를 한 번에 가져올 때는 QuerySet이라는 데이터 타입으로 가져올 수 있다

✅ 데이터 한 개

Student 타입으로 변환

  • .objects.get()을 통해 한 개의 데이터를 가져올 수 있다
    • ()안에 필터(조건)를 넣어준다
    • s_name이 honggildong과 같은 데이터만 가져오라
    • 이 값은 models.py의 __str__메서드에서 반환된 값이다!

  • type 확인해보기
    • Student객체
    • 한개의 데이터를 가져왔을 때는 클래스에서 나온 객체의 이름
    • 클래스타입 자료형으로 Student가 반환(?)

🧩 데이터 읽기

✅ 데이터 다수

  • 첨자([ ])를 이용해 접근한다 (인덱스)

  • 0부터 시작
  • 1번째는 홍길순
  • 뒤에 속성을 붙여서 원하는 내용을 가져올 수 있다

  • qs[1]의 이름
  • qs[1]의 나이
  • 기존 SQL문과는 조금 차이가 있음
  • 오히려 프로그래밍 언어와 비슷
    • 어떤 객체의 속성에 접근하는 것과 같이 dot(.)연산자를 통해 접근한다

✅ 데이터 한 개

  • 한 개만 가져온 경우 첨자(인덱스)가 필요 없다

✅ 필터를 적용해 읽기

출처: SEOUL G-캠프 유튜브

  • 언더바 두 개!

  • 나이가 22살보다 적은 사람을 가져와라
  • 홍길동

  • 나이가 22살보다 많은 사람을 가져와라
  • 홍길자

  • 나이가 22살 이하인 사람을 가져와라
  • 홍길동 홍길순

  • 나이가 22살 이상인 사람을 가져와라
  • 홍길순 홍길자

✅ 데이터 정렬

  • ()안에는 조건
  • 내림차순의 경우 조건 앞에 대쉬(-) 붙여주기

  • 나이 순(오름차순)정렬

  • 나이 순(내림차순)정렬

🧩 데이터 업데이트(수정)

 

기존

  • 데이터 하나를 get()으로 가져옴
    • 이름이 홍길동인 데이터를 가져와라
  • 해당 데이터에 .연산자로 접근하여 값을 넣어주면 된다
    • 전공 속성에 접근하고 할당연산자를 쓴 다음 내가 원하는 값을 써주기만 하면 된다
    • 일반적인 프로그래밍 언어 같음
  • 반드시 save() 해줘야 함

변경 후

🧩 데이터 삭제

  • 자료를 검색
    • filter를 통해 조건에 해당하는 것만 검색해옴
  • 검색한 데이터는 qs변수에 담긴
  • 그 것을 delete()해주면 됨
    • 주의: 안전장치가 없다. 정말 삭제할건지 확인하는 과정이 없기 때문에 데이터를 쉽게 날릴 수 있으니 유의

 

 

 

 

 

 

 

출처: https://youtu.be/fTWNpn0-fu0?si=pMDSQzBvyVRYT9V2