CLI를 통해 FK로 연결된 하위 테이블 데이터 입력하는 방법
스타벅스 홈페이지를 모델링하여 데이터베이스를 구조화하는 중에 마주한 에러메세지에 대해 다뤄보고자 합니다.
우선 CLI(Command Line Interface)인 터미널의 창 하나는 mysql에 접속하고
다른 창 하나는 python shell을 켜서 작업하시는 것을 추천드립니다.
Menu - 음료, 푸드, 상품, 카드
Categories - 콜드 브루, 브루드 커피, 에스프레소, ..., 브레드, 케이크, ..., 머그, 실물카드 등
1대 다의 구조이므로 Categories 클래스에 FK(Foreign Key - 다른 테이블을 참조)를 두어 Menu의 PK와 CASCADE를 통해 연결시켰습니다.
우선 mysql에서 Menu에 아래와 같이 값을 입력했습니다.
Menu의 경우 FK로 연결되어 있지 않기에 아래처럼 데이터를 입력하시면 됩니다. (이 경우에 아래의 column명은 Menu의 name이다)
>>> from 앱 이름.models import 클래스 명
>>> 테이블 이름.objects.create(column명='blabla')
입력한 후 해당 테이블에 있는 모든 데이터를 mysql에서 조회해 봅시다.
select * from 데이터베이스 목록 상의 테이블 이름;
원하던대로 입력이 잘 되어 있습니다.
이제 Categories에도 python의 shell에서 같은 방식으로 입력해봤습니다.
그런데......??
에러메세지가 떴습니다..
에러메세지가 뜨면 가장 마지막 부분을 유심히 보시면 방법을 찾으실 수 있습니다.
ValueError: Cannot assign "1": "Categories.menu_id" must be a "Menu" instance.
우선 구글에 ValueError: Cannot assign 이라고 검색해서 찾아보기 시작했습니다.(ValueError: instance에 초점 맞추기)
Instance의 특징에 대해 찾아보니 그 중에 이 부분이 눈에 띄었습니다.
인스턴스는 어떤 원본(추상적인 개념)으로부터 ‘생성된 복제본’을 의미한다.
'음료'의 id 값(PK)인 1을 바로 입력하면 연결이 안 되고 어떤 변수에 '음료'의 id 값을 저장한 후에 이 변수를 menu_id에 넣으면 되지 않을까 싶었습니다.
그 후에 같은 방식으로 데이터 입력을 진행했습니다.
그 결과 해당 테이블의 데이터를 조회해보면 아래처럼 성공적으로 입력이 된 것을 보실 수 있습니다.
결론 및 요약!
1. 객체, 클래스, 인스턴스 부분에 대해 정확한 이해가 필요하여 이에 대해 이해한 후에 추후에 글을 쓰도록 하겠습니다.
2. 관계형 데이터베이스 - 무결성
관계형 데이터베이스란 임이의 데이터베이스 내에 존재하는 여러 테이블들이 서로 관계를 가지며 운영되는 것을 의미하며 mysql도 관계형 데이터베이스 중 하나입니다.
그래서 테이블 간의 관계를 분명하게 설정하고 제약 조건들을 사용하여 정확한 데이터들을 설정하는 것이 중요합니다.
참조 무결성이란...?
- 참조 관계에 있는 두 테이블의 데이터가 항상 일관된 값을 가져야 한다.
- 행을 입력, 수정, 삭제할 때 연관되는 다른 테이블과의 데이터가 정확하게 유지되어야 한다.
- 여기에는 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