MySQL 05. MySQL - Table (insert, update, delete)

|

생활코딩 - MySQL

mysql monitor

  • CLI 환경인 mysql monitor에서 테이블 데이터를 삽입, 수정, 삭제, 조회 하는 방법을 살펴본다.
  • GUI 환경인 phpMyAdmin에서 쉽게 동일한 작업이 가능하다.

삽입

  • 테이블에 데이터를 삽입한다.
  • insert into 명령어를 사용
# 문법
INSERT INTO table_name VALUES (value1, value2, value3,...)
INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...)

# 예제
INSERT INTO `student` VALUES ('2', 'leezche', '여자', '서울', '2000-10-26');
INSERT INTO `student` (`id`, `name`, `sex`, `address`, `birthday`) VALUES ('1', 'egoing', '남자', 'seoul', '2000-11-16');

수정

  • 테이블에 데이터 변경한다.
  • update ... set 명령어를 사용
# 문법
UPDATE 테이블명 SET 컬럼1=컬럼1의 값, 컬럼2=컬럼2의 값 WHERE 대상이 될 컬럼명=컬럼의 값

#예제
UPDATE `student` SET address='서울';
UPDATE `student` SET name='이진경' WHERE id=1;
UPDATE `student` SET name='이고잉', birthday='2001-4-1' WHERE id=3;

삭제

  • 테이블에 데이터를 삭제한다.
  • DELETE FROM, TRUNCATE, DROP TABLE 명령어를 사용한다.

    DELETE

# 문법
DELETE FROM 테이블명 [WHERE 삭제하려는 칼럼 명=값]

# 예제
DELETE FROM student WHERE id = 2;

TRUNCATE

  • 테이블의 전체 데이터를 삭제
  • 테이블에 외부키(foreign key)가 없다면 DELETE보다 훨씬 빠르게 삭제됨
# 문법
TRUNCATE 테이블명

# 예제
TRUNCATE student;

DROP TABLE

  • 테이블을 삭제한다
# 문법
DROP TABLE 테이블명;

# 예제
DROP TABLE student;

Django 기본 05 - Migration

|

AskDjango 수업을 듣고 중요한 내용을 정리하였습니다.

migrations

  • 가이드문서
  • 모델 변경내역 히스토리 관리
  • 모델의 변경내역을 DB Schema (데이터베이스 데이터 구조)로 반영시키는 효율적인 방법을 제공
  • migration 옵션을 끌수도 있다.

관련 명령어

# 마이그레이션 파일 생성
$ python manage.py makemigrations <app-name>

# 마이그레이션 적용
$ python manage.py migrate <app-name>

# 마이그레이션 적용 현황
$ python manage.py showmigrations <app-name>

# 지정 마이그레이션의 SQL 내역
 python manage.py sqlmigrate <app-name> <migration-name>

마이그레이션 파일 생성 및 적용

  1. 마이그레이션 파일 (초안) 생성하기 : makemigrations
  2. 해당 마이그레이션 파일을 DB에 반영하기 : migrate
views
마이그레이션 절차 및 주의사항

tip

  • makemigrations 이후에는 migration 폴더를 확인하는 습관을 갖는게 좋다. DB는 중요하기 때문에 무엇이 수정되었는지 다시 한번 확인하는 습관.
  • makemigrations [app-name] 처럼 app 이름을 명시하는 것이 좋다. (예상치 못한 migration을 방지)
  • showmigrations 를 통해서 적용 상태를 조회할 수 있다. [x] : 적용 후 []: 적용 전
  • 실제 DB에는 sql 쿼리로 명령이 전달이 된다. migration 파일은 쿼리는 아니다. 따라서 sqlmigrate 명령을 통해 sql로도 확인하는 습관이 필요하다.
  • 이미 적용한 migration 파일은 절대로 지우면 안된다.
  • 프로젝트/앱 생성 후 처음 migrate 할 때는 app 이름을 명시하지 않는다. 이는 장고 기본 앱에, 여러 앱에 걸쳐서 적용할 migrate가 있기 때문이다.
  • no such table, column 등의 오류는 migration 관련 문제이다.

마이그레이션 migrate 롤백 (Forward/Backward)

일반적인 migrate

$ python manage.py migrate <app-name>
  • 미적용 마이그레이션 파일 부터 최근 마이그레이션 파일까지 Forward 마이그레이션을 순차적으로 수행한다.

특정 파일지정을 통한 migrate

$ python manage.py migrate <app-name> <마이그레이션 파일명>
  • 지정한 마이그레이션 파일이 현재 적용된 마이그레이션 파일 보다
    • 이후라면, Forward 마이그레이션 을 순차적으로 진행
    • 이전이라면, Backward 마이그레이션 을 순차적으로 진행 (롤백)

마이그레이션 파일명 지정

  • 전체 파일명을 지정하지 않더라도, 판독이 가능하다면 파일명 일부로도 지정이 가능하다.
  • 롤백 후에 돌아오면 테이블의 데이터 레코드가 사라진다. 장고 모델의 migration은 스키마의 형상관리로, 데이터 백업을 지원하지 않는다. 따라서 주기적인 백업이 필요하다.
# 파일명 예시
blog/migrations/0001_initial.py
blog/migrations/0002_create_field.py
blog/migrations/0002_update_field.py

python manage.py migrate blog 0001 # OK
python manage.py migrate blog 0002 # FAIL (다수 파일 해당)

브라우저를 통한 SQLite 확인

  • SQLiteBrowser
  • 생성한 DB 내역을 GUI 환경에서 확인 (SQLite 사용시 가능)
  • 데이터베이스 열기 메뉴를 통해서 프로젝트 폴더 내의 sqlite3.db 파일 열기

id 필드

  • 모든 데이터베이스 테이블에는 각 Row의 식별 기준인 기본키(Primary Key) 가 필요
  • Django에는 기본키로 id(AutoField)가 디폴트로 지정되어 있음 (AutoField : 1부터 시작해서 값이 1씩 증가하는 것)
  • 기본키는 줄여서 pk로도 접근 가능 (primary key)

기존 모델 클래스에 필수 필드 추가

  • 필드옵션 blank, null의 디폴트 값은 False이다. 따라서 기본적으로 모든 필드는 필수 필드이다.
  • 만약 새로운 필수 필드를 추가해서 makemigrations를 수행하면, 기존에 있는 레코드에 대해서 어떤 값을 채워 넣을지 설정해야한다.
    • 선택 1 : 지금 값을 입력
    • 선택 2 : 모델 클래스를 수정하여 디폴트 값을 제공

Django 기본 05 - 모델(Model), 모델필드, 필드옵션

|

AskDjango 수업을 듣고 중요한 내용을 정리하였습니다.

장고 모델

  • 뷰(view) 함수에서 데이터베이스에 어떤 작업을 요청할 때는 SQL 구문이 필요하다.

SQL(Structured Query Language)

  • Query: 정보수집에 대한 요청에 쓰이는 컴퓨터 언어
  • SQL : 관계형 데이터베이스 관리 시스템(Relational Database Management System)의 데이터를 관리하기 위해 설계된 특수목적의 프로그래밍 언어
  • RDBMS의 종류 : MySQL, MariaDB, PostgreSQL
  • 장고 모델은 관계형 데이터베이스 (RDBMS)만을 지원
  • 장고 모델을 통해 SQL을 생성/실행 (ORM)

Django Model

  • 장고 내장 ORM
  • ORM의 역할 : SQL을 직접 작성하지 않아도 장고 모델을 통해 데이터베이스로 접근한다. (조회/추가/수정/삭제)
  • (중요) SQL을 몰라도 된다는 것은 아니다. 최소한 내가 작성한 코드가 어떤 SQL을 만들어내는지는 검증할 수 있어야 한다.
  • 보통 하나의 장고 프로젝트에서 하나의 DB를 사용한다.
  • 파이썬 클래스 와 데이터베이스 테이블을 매핑
    • Model : DB 테이블과 매핑
    • Model Instance : DB 테이블의 1 Row

장고 커스텀 모델 정의

  • 위치 : 특정앱/models.py
  • 데이터베이스 테이블 구조/타입을 먼저 설계를 한 다음에 모델을 정의한다.
  • 모델 클래스명은 단수형을 사용한다. (Posts가 아니라 Post)
from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=100) # 길이 제한이 있는 문자열
    content = models.TextField()             # 길이 제한이 없는 문자열
    created_at = models.DateTimeField(auto_now_add=True) # 해당 레코드 생성시 현재 시간 자동저장
    updated_at = models.DateTimeField(auto_now=True) # 해당 레코드 갱신시 현재 시간 자동저장
    # DB에서는 길이제한 유무에 따라서 문자열 필드타입이 다른다.
    # 길이 제한이 없는 문자열을 많이 쓰면 성능이 좋지 않다.

모델 등록절차

  1. models.py 에서 모델클래스 정의 (상기코드 참고)
  2. shell에서 migrations, migrate 실행
  3. admin.py에 모델클래스 등록
# 2. shell에서 migrations, migrate 실행
$ python3 manage.py makemigrations
$ python3 manage.py migrate
# 위 명령을 통해서 앱폴더 아래에 migration 폴더가 생성되고 DB에 테이블을 생성한다.
# 3. admin.py에 모델클래스 등록
# 앱폴더/admin.py
from django.contrib import admin
from .models import Post

admin.site.register(Post)

지원하는 모델필드 타입

  • 가이드 문서
  • 주요 Field Types : AutoField, BooleanField, CharField, DateTimeField, FileField, ImageField,TextField
  • 주요 Relation ship Types : ForeignKey, ManyToManyField, OneToOneField

주요 Field Option

  • 필드옵션 : 필드마다 고유 옵션이 존재, 공통 적용 옵션도 있음
  • null (DB 옵션) : DB 필드에 NULL 허용 여부 (디폴트 : False)
  • unique (DB 옵션) : 유일성 여부 (디폴트 : False)
  • blank : 입력값 유효성 (validation) 검사 시에 empty 값 허용 여부 (디폴트 : False)
  • default : 디폴트 값 지정. 값이 지정되지 않았을 때 사용
  • verbose_name : 필드 레이블. 지정되지 않으면 필드명이 쓰여짐
  • validators : 입력값 유효성 검사를 수행할 함수를 다수 지정
    • 각 필드마다 고유한 validators 들이 이미 등록되어있기도 함
    • 예 : 이메일만 받기, 최대길이 제한, 최소길이 제한, 최대값 제한, 최소값 제한 등
  • choices (form widget 용) : select box 소스로 사용
  • help_text (form widget 용) : 필드 입력 도움말
  • auto_now_add : Bool, True 인 경우, 레코드 생성시 현재 시간으로 자동 저장

커스텀 모델 예시

  • max_length, verbose_name 등 주요 필드 옵션을 적용하였다.
# 앱폴더/models.py
import re
from django.db import models
from django.forms import ValidationError


def lnglat_validator(value):
    if not re.match(r'^([+-]?\d+\.?\d*),([+-]?\d+\.?\d*)$', value):
        raise ValidationError('Invalid LngLat Type')

class Post(models.Model):
    title = models.CharField(max_length=100, help_text='최대 100자 내로 입력가능합니다.'
    choices = (
              ('제목1', '제목 1 레이블'),
              ('제목2', '제목 2 레이블'),
              ('제목3', '제목 3 레이블'),
    ))
    content = models.TextField(verbose_name='내용')
    tags = models.CharField(max_length=100, blank=True)
    lnglat = models.CharField(max_length=50, blank=True,
        validators = [lnglat_validator], # 함수를 넘겨서 유효성 검사 실행
        help_text='경도, 위도 포맷으로 입력')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

170319_TIL

|

오늘 한 일

  • Swift3 & iOS10 수업을 들었다. 기본 swift 문법을 마치고 class 객체를 사용해서 도서관리 프로그램을 만들어 보았다. 책을 추가, 삭제, 검색, 조회 하는 등의 프로그램을 통해서 swift언어의 객체지향에 대해서 조금은 경험해 볼 수 있었다.
  • AskDjango 에서 Function Based View와 Class Based View에 대해서 배웠다. FBV에 먼저 충분히 익숙해 지고, CBV를 사용하는게 좋다는 내용이 인상깊었다. 정호영님 강의를 들을 때는 얼핏 목적에 맞게 CBV를 사용하는게 좋다는 이야기를 들었다. 그래서 개인 프로젝트에서도 되도록 CBV를 사용하려고 했었는데 우선은 FBV으로 구현하는 연습을 충분히 해야겠다.
  • 생활코딩 MySQL 수업을 들었다. mysql monitor와 phpMyAdmin을 사용해서 데이터베이스, 테이블을 만드는 것을 연습했다. sql문을 외우려고 하기보다 gui 환경에서 데이터베이스를 익히고 차츰 sql문에 익숙해지는게 좋다고 한다. sql문을 외우려고 너무 부담을 갖지 말아야겠다.

내일 할 일

MySQL 04. MySQL - Table (create, 필드타입)

|

생활코딩 - MySQL

Table

  • 데이터가 실질적으로 저장되는 저장소

스키마(schema)

  • 테이블에 적재될 데이터의 구조와 형식을 정의 하는 것

테이블 관리 - mysql monitor

  • phpMyAdmin를 통해서도 같은 작업을 수행 할 수 있다.
  • 초심자는 GUI환경에서 먼저 연습하고 sql문에 점점 익숙해지는 편이 좋다.

테이블 생성

  • GUI 환경에서 테이블을 생성하는 경우가 많음
CREATE TABLE table_name (
    칼럼명1 data_type,
    칼럼명2 data_type
)
CREATE TABLE `student` (
    `id`  tinyint NOT NULL ,
    `name`  char(4) NOT NULL ,
    `sex`  enum('남자','여자') NOT NULL ,
    `address`  varchar(50) NOT NULL ,
    `birthday`  datetime NOT NULL ,
    PRIMARY KEY (`id`)
);

테이블 리스트

SHOW tables;

테이블 스키마 열람

DESC `테이블명`

테이블 제거

DROP TABLE `테이블명`

데이터 타입

type 설명 기타
문자    
CHAR( ) 0 to 255 고정문자 길이 용량고정, 검색에 유리
VARCHAR( ) 0~65535 가변 문자 길이 용량 절약에 유리, 글 제목
TINYTEXT 최대 255 문자길이  
TEXT 최대 65535 문자길이 글 본문
숫자    
TINYINT( ) -128 ~ 127 정수형, 0 ~ 255 정수형, UNSIGNED  
INT( ) -2147483648 ~ 2147483647 정수형  
FLOAT 작은 부동소수점 10.35
날짜    
DATE YYYY-MM-DD  
DATETIME YYYY-MM-DD HH:MM:SS  
TIME HH:MM:SS  
기타    
ENUM ( ) 정해진 값을 강제 ENUM (‘여자’, ‘남자’ )