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 |
Linux에서 oracle instant client 설치하기
이번에는 리눅스에서 oracle instant client를 설치하고 환경변수로 등록하는 방법을 끄적여 보았습니다.
먼저 http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html에서 자신의 OS환경에
맞는 oracle instant client basic 과 sdk를 다운 받아 줍니다.
그리고 다운 받은 파일을 압축을 풀고 자신이 원하는 경로에 압축을 푼 basic 과 sdk 파일들을 모두 넣어줍니다.
이제 라이브러리 경로에 등록을 해주어야 하는데요.
.bash_profile을 열어 수정을 해줍니다.
export ORACLE_HOME=”/home/user/instantclient_12_1″
export LD_LIBRARY_PATH=”$ORACLE_HOME”
이런식으로 마지막 라인에 oracle instant client 파일 경로를 추가해줍니다.
끝~~
fortran 컴파일하고 사용하기
요즘에 잘 사용은 안하지만 어쩌다가? 사용할 수 있는 포트란 컴파일 및 사용 방법입니다.
우선 https://gcc.gnu.org/wiki/GFortranBinaries 여기에 접속해서 자신의 컴퓨터에 맞는
포트란 컴파일러를 다운 받고 설치를 합니다.
그리고 컴파일 후 사용법은
- cd /path/to/file
- gfortran -o program my_program.f
- ./program
이런식으로 사용할 수 있습니다.
'etc' 카테고리의 다른 글
윈도우 WSL2 설정 (포트포워딩, vmmem 이슈, 시작 프로그램 등) (0) | 2021.12.25 |
---|---|
우분투에 turn server 구축하기 (2) | 2019.01.27 |
wakeonlan use by terminal(wol 리눅스에서 사용하기) (0) | 2018.04.10 |
Docker의 기본적인 명령어
Docker 저장소에서 가져오기
- docker pull (dockerReponame):(dockerTagname)
Docker 이미지 목록
- docker images
Docker 컨테이너 목록
- docker ps -a
Docker 컨테이너 생성 및 배쉬 실행
- docker run -i -t –name hello ubuntu /bin/bash
Docker 이미지 삭제
- docker rmi (이미지id)
Docker 컨테이너 삭제
- docker rm (컨테이너id)
Docker 네트워크 lan설정 변경
- docker network create –subnet 192.168.1.0/24 –aux-address “DefaultGatewayIPv4=192.168.1.1” –gateway=192.168.1.200 homenet
Docker 네트워크 설정 적용해서 실행
- docker run -t -i –net=homenet (dockerReponame):(dockerTagname)
'Docker' 카테고리의 다른 글
Docker private registry 설치 및 사용법 (0) | 2023.01.21 |
---|
Pandas DataFrame를 csv로 저장하고 로드하기
Pandas DataFrame에 저장된 데이터셋을 파일로 저장하고 로드하면 좋겠다는 생각이 들어서 여러모로 검색을
하여서 조금씩 정보를 찾았다.
일단 csv로 저장하는 방법이다. 매우 간단하다.
import pandas as pd time_pd = pd.DataFrame(0., columns=col, index=time_range) time_pd.to_csv("filename.csv", mode='w')
일단 위의 소스는 time_pd라는 임의의 DataFrame을 생성한 뒤 바로 csv파일로 저장하는 소스코드이다.
mode에 인자값을 ‘a’ 로 해주면 덮어쓰기가 아닌 추가로 내용을 쓸 수 있다.
time_pd2.to_csv("filename.csv", mode='a', header=False)
이렇게 하면 위에서 말한대로 추가가 되고 header를 False 값을 주면 추가되는 값에 header가 찍히지 않는다.
dataset = pd.read_csv("filename.csv", index_col=0) print(dataset)
반대로 csv파일을 불러오는 소스코드이다. 인덱스 column을 0번째 줄로 정하겠다는 의미이다.
참으로 유용하면서 간단한 모듈이라고 할 수 있겠다.
'Python' 카테고리의 다른 글
Django 에서의 간단한 마이그레이션 과정 (0) | 2018.02.16 |
---|---|
Flask socketIO simple usage and code (0) | 2018.02.14 |
python multiprocessing 사용하기 (1) | 2018.02.12 |
python BeautifulSoup 이용한 간단한 크롤링 (0) | 2017.11.12 |
Anaconda Python package tool kit 간단한 사용법 (0) | 2017.11.08 |
python BeautifulSoup 이용한 간단한 크롤링
Python 모듈 중에서는 유명한 웹 파싱 모듈이 많이 있다.
이 포스팅에서는 그 중에 하나인 BeautifulSoup를 이용한 간단한 크롤링을 해보고자 한다.
이유는 나중에 잊어버릴 것 같다;;
먼저 자신의 파이썬 환경에 BeautifulSoup4를 설치해 준다.
pip install beautifulsoup4 등 여러가지 방법으로 자신의 환경에 설치를 한 뒤에
from bs4 import BeautifulSoup from urllib.request import urlopen
설치한 모듈을 임포트 한다. 아래 웹요청 내장 모듈도 임포트 한다.
이번에 간단하게 크롤링할 내용은 네이버 실시간 검색어이다.
base_url = "http://www.naver.com/" db = pymysql.connect("localhost","root","123456","realtimekeyword", charset='utf8') cursor = db.cursor()
크롤링만 하면 심심해서 나는 mysql db에 크롤링한 내용을 저장해 보았다.
url에 네이버 홈 url을 저장한 뒤 pymysql 모듈로 로컬에 접속을 cursor에 저장하였다.
이 후에 본격적으로 파싱 코드를 작성하였다.
data = urlopen(base_url).read() soup = BeautifulSoup(data, "html.parser") total_data = str(soup.find_all(attrs={'class': 'ah_l'})) datalist = total_data.split('<li class=')
네이버url을 요청한 뒤 beautifulsoup를 통해 파싱한 정보를 soup에 저장한 뒤
soup에 저장된 데이터에서 class타입이 ‘ah_l’인 모든 정보를 찾아서 total_data에 저장하였다.
그리고 그 하위의 ‘<li class=’로 된 정보를 스플릿하여 datalist라는 리스트에 저장하였다.
이 과정에서 리스트에는 각 실검 단어들이 리스트 하나하나에 들어가게 된다.
현재 기준의 네이버의 페이지 코드이다. 이것을 참고하면서 파싱하면 된다.
전체 코드는 이러하다.
#-*- coding: utf-8 -*- from bs4 import BeautifulSoup from urllib.request import urlopen from datetime import datetime, timedelta import time import pymysql from traceback import format_exc base_url = "http://www.naver.com/" db = pymysql.connect("localhost","root","123456","realtimekeyword", charset='utf8') cursor = db.cursor() def collecting(base_url): while True: data = urlopen(base_url).read() soup = BeautifulSoup(data, "html.parser") total_data = str(soup.find_all(attrs={'class': 'ah_l'})) datalist = total_data.split('<li class=') data = [] nowtime = datetime.utcnow() + timedelta(hours=9) for each in datalist[1:]: try: RRank = int(each.split('class="ah_r">')[1].split('</span>')[0]) tit = str(each.split('class="ah_k">')[1].split('</span>')[0]) rk = int(each.split('class="ah_r">')[1].split('</span>')[0]) data.append((RRank, tit, rk, str(nowtime))) except IndexError: print(format_exc()) query = """insert into keywords(rtrank, title, rank, recordtime) values (%s, %s, %s, %s)""" cursor.executemany(query, tuple(data)) db.commit() time.sleep(300) collecting(base_url)
좀 허접하지만 연습 정도는 충분히 된다.
디비에는 이러한 식으로 저장이 된다.
'Python' 카테고리의 다른 글
Django 에서의 간단한 마이그레이션 과정 (0) | 2018.02.16 |
---|---|
Flask socketIO simple usage and code (0) | 2018.02.14 |
python multiprocessing 사용하기 (1) | 2018.02.12 |
Pandas DataFrame를 csv로 저장하고 로드하기 (0) | 2017.11.12 |
Anaconda Python package tool kit 간단한 사용법 (0) | 2017.11.08 |
mysql 유저 비밀번호 정책 low level 단계로 낮추기
SET GLOBAL validate_password_policy=LOW;
위의 쿼리를 실행하면 끝남.
NodeJS의 forever 모듈 설치하고 다루기
NodeJS에 여러가지 유용한 모듈들이 많지만 나는 이것을 즐겨 쓴다.
background에서 앱이 꺼지지 않고 돌아가게 해주는 모듈인데 이름도 그에 걸맞게
forever라고 한다.
우선 설치 방법부터 소개한다. npm패키지 설치툴로 설치하도록 하면 매우 간단하다.
npm install -g forever
이제부터 바로 사용할 수가 있다.
forever start node app.js 명령어를 치면 app.js를 바로 백그라운드에서 무제한으로 돌게 된다.
그리고 이렇게 돌아가는 프로세스들의 리스트를 조회할 수 있는 명령어가
forever list 이다.
아무 프로세스가 돌아가지 않을 시에 이렇게 표시가 된다.
forever 프로세스가 돌아갈 시에는 이렇게 표시가 된다.
forever 프로세스를 정지시킬려면 forever stop (pid)를 입력하면 정지가 된다.
'JavaScript > NodeJS' 카테고리의 다른 글
NodeJS로 간단한 채팅 서버 구축하기 (0) | 2018.02.20 |
---|