1:N (Article : comment)
- on_delete = models.CASCADE : 외래키가 참조하는 객체가 사라졌을 때, 이를 참조하는 객체도 삭제
- Related manager
- 역참조 : 나를 참조하는 테이블을 참조하는 것
- N : 1의 관계에서, 1이 N을 참조하는 것
article.comment_set.all()
- 언더바에 유의.
- related_name = ''은 외래키가 있는 곳에서 역참조를 당할때 쓰여질 이름
save(commit = False)
- 아직 데이터베이스에 저장되지 않은 인스턴스를 반환
- settings.AUTH_USER_MODEL(model.py에서만 사용)
- 반환 값 : 'accounts.User' / User 모델에 대한 외래키 또는 M:N 관계를 정의할 때 사용
- get_user_model()
- 반환 값 : User Object(객체)
- 현재 활성화 된 User모델을 반환
- 커스터마이징한 user모델이 있으면, Cutom user model 그렇지 않으면, user 반환
- models.py가 아닌 다른 모든 곳에서 유저 모델을 참조할 때 사용
- Migration시 멘트, 모든 컬럼은 NOT NULL 제약 조건이 있기 때문에 데이터가 없이는 새로 추가되는 외래 키 필드 user_id가 생성되지 않아서 생기는 문제.
- 기본값 작성 필요
- 외래키 데이터 누락
- 게시글 작성 시 작성자 정보가 함께 저장될 수 있도록 save의 commit옵션 활용
M:N
- ManyToManyField
1. related_name
2. through
- 중개 테이블을 직접 작성하는 경우, through 옵션을 사용하여 중개 테이블을 나타내는 Django 모델을 지정
3. symmetrical
- ManyToManyField가 동일한 모델을 가리키는 정의에서만 사용
- True일 경우 _set매니저를 추가하지 않음
- False일 경우 대칭 X
user가 작성한 글들과 user가 좋아요를 누른 글이 전부 user.article_set으로 매니저가 생성되므로 user와 관계된 ForeignKey 혹은 ManyToManyField 중 하나에 related_name 을 작성해야 함
- .exists()
- QuerySet에 결과가 포함되어 있으면 True, 그렇지 않으면 false를 반환
Data Types 종류
- Null
- INTEGER
- REAL
- TEXT
- BLOB (Binary Large Object)
- 입력된 그대로 저장된 데이터 덩어리
- ex) 이미지 데이터
- SQLite Datatypes의 특징은, 동적 타입시스템을 사용한다.
- 컬럼에 선언된 데이터 타입에 의해서가 아니라 컬럼에 저장된 값에 따라 데이터 타입이 결정됨
Constrains
- 데이터무결성
- 데이터베이스 내의 데이터에 대한 정확성, 일관성을 보장하기 위해 데이터 변경 혹은 수정 시 여러 제한을 두어 데이터의 정확성을 보증하는 것
- 종류
- NOT NULL
- 컬럼이 NULL 값을 허용하지 않도록 지정
- 기본적으로 테이블의 모든 컬럼은 NOT NULL 제약조건 명시적으로 사용하는 경우를 제외하고는 NULL값을 허용
- UNIQUE
- 컬럼의 모든 값이 서로 구별되거나 고유한 값이 되도록 함
- PRIMARY KEY
- 테이블에서 행의 고유성을 식별하는 데 사용되는 컬럼
- 테이블 당 하나의 기본 키
- 암시적으로 NOT NULL 제약 조건 포함
- AUTOINCREMENT
- 사용되지 않은 값이나 이전에 삭제된 행의 값을 재사용하는 것을 방지
- 그 외
row id
- 값은 1에서 시작
- 값이 명시적으로 지정되지 않은 경우, 다음 순차 정수를 자동으로 할당
- INTEGER PRIMARY KEY키워드를 가진 컬럼을 직접 만들면 이 컬럼은 rowid 컬럼의 별칭(alias)이 됨
ALTER TABLE
- Rename
ALTER TABLE table_name RENAME TO _;
ALTER TABLE table_name RENAME COLUMN _ TO __;
- Add
ALTER TABLE table_name ADD COLUMN _';
- Delete
- DROP
- 삭제하지 못하는 경우가 존재
- 컬럼이 다른 부분에서 참조되는 경우
- PRIMARY KEY인 경우
- UNIQUE 제약조건이 있는 경우
DROP TABLE
DROP TABLE table_name;
1. 한번에 하나의 테이블만 삭제할 수 있음
2. 여러 테이블을 제거하려면 여러 DROP TABLE문을 실행해야 함
3. DROP TABLE 문은 실행 취소하거나 복구할 수 없음
DML
- 문법 순서
- SELECT (DISTINCT) AVG()/ column FROM table ORDER BY _ LIMIT _ OFFSET _;
- ``
ECT last_name, count(*) FROM GROUP BY ORDER BY _;
INSERT statement
INSERT INTO table_name (column1) VALUES(value1);
- 만약 컬럼목록을 생략하는 경우, 값 목록의 모든 컬럼에 대한 값을 지정해야 함
- 값 목록의 개수는 컬럼 목록의 컬럼 개수와 같아야 함
UPDATE
UPDATE _ SET _ WHERE;
DELETE
DELETE FROM table_name WHERE search_condition;
- 모든 데이터 삭제하기
DELETE FROM classmates;