일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- cookie
- class
- Sequelize
- TypeScript
- AWS
- nodejs
- nestjs
- Queue
- Nest.js
- MongoDB
- game
- 정렬
- 공룡게임
- Dinosaur
- flask
- Python
- dfs
- GIT
- OCR
- 게임
- JavaScript
- typeORM
- MySQL
- react
- jest
- Bull
- 자료구조
- mongoose
- Express
- Today
- Total
포시코딩
[Flask] DB 모듈화 - app.py에서 class로 분리하기 (pymysql) 본문
개요 및 문제발견
팀프로젝트에서 pymysql을 통해 mysql과 연동을 하기로 결정했다.
app.py 각 함수에서 db를 호출해 쓰고 데이터 처리 후 db.close() 해주는 방식으로 만들었는데
만들고보니 코드가 너무 더러웠다.
(before)
db = pymysql.connect(
host='127.0.0.1',
user='root',
db='dog94',
password='dog94',
charset='utf8')
curs = db.cursor(pymysql.cursors.DictCursor)
email_receive = request.form.get("email_give")
curs.execute('SELECT * FROM user WHERE email = %s', (email_receive))
check = curs.fetchall()
db.commit()
db.close()
(SELECT문 하나를 위해 이런 코드가 계속 반복되었다.)
좋은 방법이 없을까하다가 해당 db 관련된 부분을 클래스화 시켜 사용하면 어떨까라는 의견이 나왔고
바로 작업에 들어갔다.
해결방안 적용 및 결과
(db.py)
import pymysql
class DB:
def __init__(self, dict):
self.con = pymysql.connect(
host='localhost',
user='root',
password='dog94',
db='dog94',
charset='utf8', # 한글처리 (charset = 'utf8')
autocommit=True, # 결과 DB 반영 (Insert or update)
)
if dict=='dict':
self.cur = self.con.cursor(pymysql.cursors.DictCursor)
else:
self.cur = self.con.cursor()
def select_one(self, sql, args=None):
self.cur.execute(sql, args)
result = self.cur.fetchone()
self.cur.close()
self.con.close()
return result
def select_all(self, sql, args=None):
self.cur.execute(sql, args)
result = self.cur.fetchall()
self.cur.close()
self.con.close()
return result
def save_one(self, sql, args=None):
result = self.cur.execute(sql, args)
self.cur.close()
self.con.close()
return result
def save_all(self, sql, args=None):
result = self.cur.executemany(sql, args)
self.cur.close()
self.con.close()
return result
app.py 옆에 db.py로 위와 같은 클래스를 만들었고,
위에서 email 관련 코드에 적용한 결과는 다음과 같다.
(after)
email_receive = request.form.get("email_give")
sql = 'SELECT * FROM user WHERE email = %s'
conn = DB('dict')
check = conn.select_one(sql, email_receive)
한눈에 봐도 코드가 확 줄은걸 볼 수 있는데
전체 코드상으로는 100줄 가량이 줄어들었다.

후기
그 이후로도 추가되는 기능들에서 db 모듈은 계속 사용되었고
다른 팀원 모두 처음에는 어색해했지만 이내 편리함을 느꼈다고 말해주었다.
최종적으로 우리는 db 모듈화를 통해 처음에 얻고자 했던 코드의 간략화, 단순화를 포함해서
재사용성으로 인한 개발과 유지보수에 까지 긍정적인 결과를 얻을 수 있었다.
도움을 얻은 곳
https://velog.io/@kwonyoung/Python-pymysql로-MaridDB-연결-클래스-모듈화
[Python] pymysql로 MaridDB 연결 클래스 모듈화
위와 같이 DB 클래스를 하나 생성해두면 다른 파일에서 불러와 바로 사용 가능SELECT (UPDATE, INSERT, DELETE) ONE(UPDATE, INSERT, DELETE) ALLone과 all을 분리한 이유는 executmany를 넣을 때 1차원 리스트를
velog.io
'Python > Flask' 카테고리의 다른 글
Log 파일에 Ascii Art(아스키아트) 써먹기 (0) | 2022.12.07 |
---|---|
[Flask] 서버 2번 실행되는 문제 해결 (0) | 2022.12.07 |
Flask logging 기능을 통한 로깅 시스템 구현 (1) | 2022.12.07 |
Flask + JS, Ajax 파일 업로드 및 데이터 전송 (0) | 2022.12.06 |
[Flask + MySQL] CRUD using Pycharm (0) | 2022.12.01 |