Django 에서의 간단한 마이그레이션 과정
이번에는 django 프레임워크의 디비에 관한 강력한 기능이자 장점인 orm 기능의
마이그레이션에 관해 간단하게 알아보고자 합니다.
- 우선 models.py 파일을 만들어서 디비 스키마를 넣어주는 방법이 있습니다. 이 방법은 models.py 안에 여러가지 스키마를 넣어주는 방법인데요.
- 조금 더 규모가 크거나 테이블별로 파일을 생성하신다 하면 models 라는 파이썬 패키지를 생성해주고, 그안에 테이블별로 파일을 생성해 주셔도 됩니다.
여기서는 2번에 관하여 마이그레이션을 진행할 것 입니다.
우선 models라는 패키지 안에 user.py 라는 테이블 파일을 생성해줍니다.
그리고 그 안에 User 모델 클래스를 생성하고 간단한 스키마를 작성하였습니다.
from django.db import models from django.utils import timezone class User(models.Model): user_id = models.CharField(max_length=100, primary_key=True) email = models.CharField(max_length=100, default="") name = models.CharField(max_length=30, default="") gender = models.CharField(max_length=10, default="남자") age = models.DateTimeField(max_length=100, default=timezone.now) country = models.CharField(max_length=100, default="") etc = models.TextField(default=None, null=True) group = models.CharField(max_length=50, default="client")
그리고 같은 경로 상에 __init__.py 파일이 존재해야 하는데요
__init__.py 파일 안에
from .user import *
로 작성해 줍니다.
이제 위 모델패키지가 존재하는 앱을 django settings.py에 포함을 시켜줍니다.(이미 있다면 안하셔도 됩니다.)
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', '앱이름', 'client', ]
여기까지 완료되었다면 django 마이그레이션 파일을 django가 생성하도록 스크립트를 콘솔상에서 실행해줍니다.
python manage.py makemigrations '앱이름'
스크립트 실행 후에 앱 패키지 안에 migrations 디렉터리가 자동으로 생성되고 그 안에 마이그레이션 파일도 생성됩니다.
여기까지 마이그레이션 파일 생성 과정입니다.
후에 settings.py 파일 안에 있는 디비 정보와 매칭되는 디비정보가 같다면 바로 마이그레이트까지 가능합니다.
디비에 스키마를 반영하고 싶다면 아래 스크립트를 실행하여 주면 됩니다.
python manage.py migrate
'Python' 카테고리의 다른 글
Python sounddevice를 이용한 소리 탐지 (0) | 2018.04.23 |
---|---|
python configparser 사용하기 (0) | 2018.03.28 |
Flask socketIO simple usage and code (0) | 2018.02.14 |
python multiprocessing 사용하기 (1) | 2018.02.12 |
Pandas DataFrame를 csv로 저장하고 로드하기 (0) | 2017.11.12 |
Flask socketIO simple usage and code
socketIO 관련 프로젝트를 하면서 NodeJS를 처음부터 사용할 생각은 아니었지만
어쩌다가 Flask를 이용한 socketIO를 사용하게 되어 간단한 구조를 살펴보고 제가 작성한 코드를
올리려고 합니다.
우선 이 Flask socketIO란 놈은 구버전 익스플로러같은 곳에서는 수신이 안될 수 있으니 주의하시기 바랍니다.
저도 그것때문에 NodeJS socketIO로 바꿨습니다. 그것 빼고는 아주 무난하게 동작합니다.
from flask import Flask, render_template from flask_socketio import SocketIO, emit
우선 해당 라이브러리들을 임포트해줍니다.
그리고 플라스크 socketIO 객체를 생성합니다.
app = Flask(__name__) app.config['SECRET_KEY'] = 'secret!' socketio = SocketIO(app)
그리고 밑에 코드는 써도 좋고 안써도 좋습니다. 결과를 관찰하기 위해 html 템플릿을 렌더시킨 것이기 때문입니다.
@app.route('/') def index(): return render_template('data.html')
그리고 run을 시켜주면 되는데요.
global app socketio.run(app, host='0.0.0.0', port=5555)
저는 포트넘버를 5555로 잡았습니다.
그리고 간단한 수신부 코드를 만들어 보았습니다. 수신부 명을 ‘real_time’ 이라고 임의로 지어 주고, send_data라는 함수명은 아무렇게 지어줘도 상관없습니다.
그리고 함수명 옆에 message라는 파라미터는 발신부에서 보내주는 데이터를 받아올 수 있는 파라미터입니다.
@socketio.on('real_time') def send_data(message): from datetime import datetime global timecheck global result try: now = str(datetime.utcnow().replace(microsecond=0)) if timecheck == now: emit('fromserver', json.dumps({'data': result['data']})) else: get = {"time": now} result = db["buffer"].find_one(get) emit('fromserver', json.dumps({'data': result['data']})) timecheck = now # exception handling except: # db.close() print("occur exeption" + format_exc())
저는 수신부와 연결된 모든 클라이언트에게 전송할 것이기 때문에 emit함수를 사용하였는데요, 사용 목적에 따라 함수 선택 해주시면 됩니다.
자세한 설명은 flask-socketIO 문서를 참고하세요.
이 단락의 코드를 간단히 설명하자면 ‘real_time’ 이라는 수신부로 받은 소켓데이터에서 message 파라미터는 이용하지 않았지만 현재 시간을 기준으로 db[“buffer”]에 있는 데이터를 얻어 json으로 파싱하여 모든 클라이언트에 전송하는 로직의 코드입니다.
풀 소스코드는 아래에 첨부하였습니다.
# -*- coding: utf8 -*- import multiprocessing import pandas as pd from pandas.tseries.offsets import Hour, Minute, Second import json from traceback import format_exc from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client['seismic'] timecheck = "" result = [] from flask import Flask, render_template from flask_socketio import SocketIO, emit app = Flask(__name__) app.config['SECRET_KEY'] = 'secret!' socketio = SocketIO(app) @app.route('/') def index(): return render_template('data.html') class IO_Socket(multiprocessing.Process): """client connection generator""" def __init__(self): """ constructor for multiprocessing """ multiprocessing.Process.__init__(self) self.__suspend = False self.__exit = False def run(self): """Process start method""" # wrap Flask application with socketio's middleware global app socketio.run(app, host='0.0.0.0', port=5555) def mySuspend(self): self.__suspend = True def myResume(self): self.__suspend = False def myExit(self): self.__exit = True @socketio.on('real_time') def send_data(message): from datetime import datetime global timecheck global result try: now = str(datetime.utcnow().replace(microsecond=0) + Hour(9) - Second(5)) if timecheck == now: emit('fromserver', json.dumps({'data': result['data']})) else: get = {"time": now} result = db["buffer"].find_one(get) emit('fromserver', json.dumps({'data': result['data']})) timecheck = now # exception handling except: # db.close() print("occur exeption" + format_exc()) # pass # else: # print('off mode') # pass # else: # send_by_time(message)
전체 코드 중에서 몽고 디비를 같이 쓰긴 했지만 쓰시는 목적에 따라 코드 변경해 주시면 됩니다.
'Python' 카테고리의 다른 글
python configparser 사용하기 (0) | 2018.03.28 |
---|---|
Django 에서의 간단한 마이그레이션 과정 (0) | 2018.02.16 |
python multiprocessing 사용하기 (1) | 2018.02.12 |
Pandas DataFrame를 csv로 저장하고 로드하기 (0) | 2017.11.12 |
python BeautifulSoup 이용한 간단한 크롤링 (0) | 2017.11.12 |
python multiprocessing 사용하기
이번에는 python의 GIL문제에 대응하여 병렬로 작업을 처리할 수 있는 파이썬 내장 라이브러리인 multiprocessing 에 대해 끄적여 보겠습니다.
python의 multiprocessing을 사용하는 방법은 간단합니다. threading을 사용하는 방법과 비슷합니다.
우선
import multiprocessing
하여 multiprocessing 을 가져와 줍니다.
그리고, 저는 클래스 방식으로 구현을 할 것인데요, 제가 사용하고 있는 소스코드를
가져와 봤습니다.
class DemoClass(multiprocessing.Process):
def __init__(self):
"""
constructor for multiprocessing
"""
multiprocessing.Process.__init__(self)
self.__suspend = False
self.__exit = False
def run(self):
# Enter the code you want
run 함수 부분에 원하는 multiprocessing 구현부를 작성해주시면 됩니다.
이 multiprocessing 함수는 python의 (Global Interpreter Lock)문제를 피해갈 수 있습니다.
대신에 프로세스간 변수를 공유하려면 또 다른 방법을 써야하는데요
그 방법은 다음에 다뤄보겠습니다.
'Python' 카테고리의 다른 글
Django 에서의 간단한 마이그레이션 과정 (0) | 2018.02.16 |
---|---|
Flask socketIO simple usage and code (0) | 2018.02.14 |
Pandas DataFrame를 csv로 저장하고 로드하기 (0) | 2017.11.12 |
python BeautifulSoup 이용한 간단한 크롤링 (0) | 2017.11.12 |
Anaconda Python package tool kit 간단한 사용법 (0) | 2017.11.08 |