-
CLI를 통해 FK로 연결된 하위 테이블 데이터 입력하는 방법Django 2021. 12. 12. 22:59
스타벅스 홈페이지를 모델링하여 데이터베이스를 구조화하는 중에 마주한 에러메세지에 대해 다뤄보고자 합니다.
우선 CLI(Command Line Interface)인 터미널의 창 하나는 mysql에 접속하고
다른 창 하나는 python shell을 켜서 작업하시는 것을 추천드립니다.
스타벅스 홈페이지의 MENU / 음료, 푸드, 상품, 카드 부분 모델링 Menu - 음료, 푸드, 상품, 카드
Categories - 콜드 브루, 브루드 커피, 에스프레소, ..., 브레드, 케이크, ..., 머그, 실물카드 등
models.py의 Menu와 Categories 클래스 (1 대 다) 1대 다의 구조이므로 Categories 클래스에 FK(Foreign Key - 다른 테이블을 참조)를 두어 Menu의 PK와 CASCADE를 통해 연결시켰습니다.
우선 mysql에서 Menu에 아래와 같이 값을 입력했습니다.
Menu의 경우 FK로 연결되어 있지 않기에 아래처럼 데이터를 입력하시면 됩니다. (이 경우에 아래의 column명은 Menu의 name이다)
>>> from 앱 이름.models import 클래스 명
>>> 테이블 이름.objects.create(column명='blabla')
FK로 연결되어 있지 않은 경우의 데이터 입력 방법 (python의 shell) 입력한 후 해당 테이블에 있는 모든 데이터를 mysql에서 조회해 봅시다.
select * from 데이터베이스 목록 상의 테이블 이름;
해당 테이블에 있는 모든 데이터 조회 (mysql) 원하던대로 입력이 잘 되어 있습니다.
이제 Categories에도 python의 shell에서 같은 방식으로 입력해봤습니다.
콜드 브루 커피는 Menu에서 '음료'이므로 menu_id에는 1을 넣으면 될 것이라고 생각했습니다... 그런데......??
에러메세지가 떴습니다..
에러메세지가 뜨면 가장 마지막 부분을 유심히 보시면 방법을 찾으실 수 있습니다.
ValueError: Cannot assign "1": "Categories.menu_id" must be a "Menu" instance.
우선 구글에 ValueError: Cannot assign 이라고 검색해서 찾아보기 시작했습니다.(ValueError: instance에 초점 맞추기)
Instance의 특징에 대해 찾아보니 그 중에 이 부분이 눈에 띄었습니다.
인스턴스는 어떤 원본(추상적인 개념)으로부터 ‘생성된 복제본’을 의미한다.
'음료'의 id 값(PK)인 1을 바로 입력하면 연결이 안 되고 어떤 변수에 '음료'의 id 값을 저장한 후에 이 변수를 menu_id에 넣으면 되지 않을까 싶었습니다.
a라는 변수에 get을 통해 id 값이 1인 '음료'를 저장 그 후에 같은 방식으로 데이터 입력을 진행했습니다.
FK로 연결한 경우의 데이터 입력 방법 예시 그 결과 해당 테이블의 데이터를 조회해보면 아래처럼 성공적으로 입력이 된 것을 보실 수 있습니다.
Categories 테이블의 데이터 조회 결과 결론 및 요약!
1. 객체, 클래스, 인스턴스 부분에 대해 정확한 이해가 필요하여 이에 대해 이해한 후에 추후에 글을 쓰도록 하겠습니다.
2. 관계형 데이터베이스 - 무결성
관계형 데이터베이스란 임이의 데이터베이스 내에 존재하는 여러 테이블들이 서로 관계를 가지며 운영되는 것을 의미하며 mysql도 관계형 데이터베이스 중 하나입니다.
그래서 테이블 간의 관계를 분명하게 설정하고 제약 조건들을 사용하여 정확한 데이터들을 설정하는 것이 중요합니다.
이번 글의 경우는 참조 무결성 - Foreign Key와 연관이 크다. 참조 무결성이란...?
- 참조 관계에 있는 두 테이블의 데이터가 항상 일관된 값을 가져야 한다.
- 행을 입력, 수정, 삭제할 때 연관되는 다른 테이블과의 데이터가 정확하게 유지되어야 한다.
- 여기에는 Foreign Key가 있다.
Foreign Key란...?
- 다른 테이블의 데이터를 참조할 때 없는 값을 참조할 수 없도록 한다.
- 참조될 테이블이 먼저 만들어지고 값이 먼저 입력되어야 한다.
- 이때 참조될 열의 값은 참조될 테이블에서 Primary Key로 설정되어 있어야 한다.
자세히 잘 설명해주신 글이 있기에 아래에 참고사이트를 남겨두겠습니다.
https://nachwon.github.io/django-9-ORM/
[Django Tutorial] Blog 만들기 - 9. ORM
동적으로 템플릿을 생성하기 위해서는 먼저 ORM 에 대해 알아야한다.
nachwon.github.io
https://jerryjerryjerry.tistory.com/50
[SQL] 무결성, 제약조건
* 관계형 데이터베이스 - 관계형 데이터베이스란 임의의 데이터베이스 내에 존재하는 여러 테이블들이 서로 관계를 가지며 운영되는 것을 의미한다. - 관계형 데이터베이스는 테이블 간의 관계
jerryjerryjerry.tistory.com
'Django' 카테고리의 다른 글
TypeError : Field 'id' expected a number but got <User : User object (1)> (0) 2022.01.05 Django 테이블 이름 변경 및 삭제 후 마이그레이션시 에러 (0) 2021.12.28 Login의 View 작성시 피해야 할 코드 작성법 (0) 2021.12.23 Email Validation (이메일 유효성 검사 - 정규표현식 활용) (0) 2021.12.19 Foreign Key - CASCADE (0) 2021.12.16