본문 바로가기
서버 공부

MySQL Database 와 Django(장고) 서버 연결 방법, 기본 MySQL 명령어

by 마루청 2021. 4. 7.
728x90

Before

 

개발 중인 장고 서버와 MySQL 연동이 잘 안됐어서 맨땅에서 DB 공부하는 겸 나중에 참고하려고 작성해둔 글.

마찬가지로 맨땅에서 서버 개발 막 시작하시는 초보분들을 위해 공개함. 내가 틀렸거나 헤맸던 부분 해결한 방법도 전부 올림.

 

 

 

장고 MySQL 연결

 

장고에서 MySQL 불러오는 코드는 다음과 같다.

 

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'name',
        'USER': 'root',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}

 

Django에서 settings.py 에 DATABASES가 있다. 기본으로는 sqlite3 으로 설정되어있는데 MySQL을 사용할 것이기 때문에 MySQL 로 바꾼다.

Name은 DataBase 이름이고 user와 password는 Mysql에서 로그인할 때 사용하는 id 비번을 입력해준다.

id는 꼭 root가 아니라 다른 id도 장고에서 DB에 접근할 수 있다. 그렇지만 나중에 MySQL 설정을 변경할 때는 root 계정으로 로그인 해야한다.

host와 port도 알아서 설정해주면 되는데 디폴트는 위와 같다.

 

* MySQL 사용하려면 MySQL만 다운 받는게 아니라 그에 맞는 파이썬을 다운받아야함. 버전 잘 보고 다운받자.

 

장고에서 서버 처리를 하면서 생긴 값을 모델에 저장한다. 그리고 그 model 값을 DB에 저장할 때 model.save()를 꼭 해준다. 안 해주면 DB에 저장 안됨.

 

 

 

MySQL Database 생성 및 기본 명령어

 

데이터를 여러 개를 저장할 때, 파일 뭉텅이로 그대로 놔두면 원하는 정보를 쉽게 얻어낼 수 없다. 따라서 그 저장된 파일들의 정보를 잘 활용할 수 있도록 서로 관련 있는 데이터들끼리 모아두고 쉽게 접근할 수 있도록 시스템을 만들었는데 이것이 바로 데이터베이스이다.

 

기본적으로 MySQL에서는 table로 정보를 관리한다.

table의 column에는 그 속성이 있고 그 속성에 따라 data의 정보가 들어간다.

 

  • mysql shell 로그인
\sql
\connect (id)@localhost

MySQL 서버 연결

root@localhost 이다 띄어쓰기 하면 오류난다.

 

  • DataBase, Table 생성

table로 정보를 관리하기 때문에 database를 만들고 그 뒤 정보가 저장될 table을 만들어야 한다.

table은 column의 속성을 다 지정해줘야 한다.

장고와 연동하고 싶으면 장고에서 만든 model과 같은 속성을 가진 table을 생성하면 된다. 

 

* 장고에서는 model을 생성할 때 id field가 없어도 id를 자동으로 만들어주는데 MySQL에는 없다. 따라서 MySQL과 연동하면서 table column이 달라 오류가 발생한다. MySQL에서 table을 만들 때는 장고 model에는 id가 없어도 id를 직접 만들어줘야 에러가 안 난다. 이 id는 데이터베이스에서 한 data와 다른 data를 구분짓는 primary key가 된다.

 

# 데이터베이스 생성 
CREATE DATABASE <DB_NAME> CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

# 테이블 생성
CREATE TABLE <TABLE_NAME> (id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY, value1 INT NOT NULL, time DATETIME NOT NULL);

# 생성되었는지 확인
SHOW DATABASES;
SHOW TABLES;

 

Table을 생성할 때 'column_name' 'field_type' 순으로 적어나가면 된다.

ex) id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY

id : column 이름

INT(10) : field_type이 int이다. 괄호 안의 숫자는 id value의 최대가 10자리까지라는 뜻이다.

NOT NULL : data를 만들 때 이 id에 해당하는 column에 값이 없으면 안된다는 뜻이다.

AUTO_INCREMENT : data가 들어올 때 자동적으로 앞의 data의 값보다 +1씩 늘어난다는 뜻이다.

PRIMARY KEY : 이 data와 다른 data를 구분짓는 값으로 다른 data와 중복될 수 없다.

 

  • DataBase 활용

사실 장고 결과물은 웹에서 보기 때문에 show는 장고에서 view.py에서 mysql 저장된 값을 불러와 보여주면 된다.

insert랑 update 등도 장고에서 model 불러와서 활용하면 된다. 

 

MySQL에서는 Data 잘 저장 되었는지 확인만 했다. 그 때 사용한 코드들이다.

* Table을 사용하기 위해서는 꼭 해당 Database를 선택해야한다.

 

USE <DB_NAME>;

을 사용하면 해당 DB에 들어갈 수 있다.

 

# column 의 속성을 보고 싶을 때
DESC <TABLE_NAME>;

# table 내용 전체를 보고 싶을 때
SELECT * from <TABLE_NAME>;

# table 내용 중 일부 column만 뽑아보고 싶을 때
SELECT <column1>, <column2> from <TABLE_NAME>;

# MYSQL table 안 내용 전체 싹 지우기 (내용만 지우는 것. table은 안사라짐)
TRUNCATE <TABLE_NAME>;

# Table 지우기
DROP TABLE <TABLE_NAME>;

 

 

 

이벤트 스케쥴러를 이용한 DB 관리

 

MySQL에서는 event를 발생시켜 해당 database를 관리할 수 있다. 이 부분은 root 계정으로 들어가 설정. event를 on으로 해주고 아래 코드를 작성하면 특정 시간에 그 event를 발생시킬 수 있다.

 

최종최종 이벤트 스케줄러 소스코드

- 매일마다 특정 일수가 지난 오래된 데이터들을 자동 삭제하는 이벤트를 작성해보았다.

 

CREATE EVENT IF NOT EXISTS table_refresh
ON SCHEDULE
EVERY 1 DAY
STARTS CURRENT_TIMESTAMP
DO
DELETE from <DB_NAME>.<TABLE_NAME> where <column_name> <= date_sub(curdate(), INTERVAL 1 MONTH);

 

해석해보자면 먼저 동일 이름이 없을 때 event를 만든다.

EVERY 1 DAY : 얼만큼 반복할지. every가 아닌 at을 사용하면 한 번만 실행한다. 이것은 원하는대로 조정할 수 있다. 

STARTS CURRENT_TIMESTAMP : 정해진 시간부터 이벤트 시작. 현재시각을 나타내는 CURRENT_TIMESTAMP 말고 특정 시간을 적어주어도 좋다.

DO 이후에 나타나는 것이 이벤트 내용이다. 한 줄이면 그냥 적어도 좋지만 2줄 이상일 경우에는 BEGIN END문을 사용한다.

위 예시는 table의 전체 data 중 해당 column이 현재 시간보다 한 달 이상 된 것이면 삭제한다.

 

내 경우에는 저 column이 DateTime field를 사용하고 있어서 만약 다른 field여도 적용되는지는 안해봐서 모르겠다. 하지만 data_sub는 날짜를 빼는 명령어이기 때문에 DataTime field여야 할 것 같다. 이 때문인지 아닌지는 잘 모르겠는데  Time field를 사용했을 때는 적용이 잘 안됐던 것 같다. 그 당시는 Interval 1 day로 했었는데 삭제가 안됐었다. 근데 그거 말고도 애초에 column name을 틀리게 적었던 적도 있어서 확실치는 않지만 여튼 그렇다.

728x90

댓글