pymysql 을 쓰려면, sql 한줄 던지는데도
conn(host="주소", user="이름", pw="비번", db="디비이름") 만들고,
cursor만들고,
execute하고,
fetchall 하거나 commit 하고,
conn 과 cursor 따로따로 close 하는 등
너무너무 복잡하다.
그래서 간편하게 사용할 수 있는 코드를 만들어봤당
#db.py
import pymysql
def errorprint(e):
print(e.args[0] + " : " + e.args[1])
class newDB:
def __init__(self, host="0.0.0.0", user="root", passwd="1234asdf", db="test_db"):
try:
self.db = pymysql.connect( host=host, user=user, passwd=passwd, db=db)
except pymysql.err.DatabaseError as e:
errorprint(e)
except pymysql.err.OperationalError as e:
errorprint(e)
def executer(self, query, params=''):
try:
if params == '':
self.cursor.execute(query)
else :
self.cursor.execute(query, params)
if 'select' in str.lower(query[:7]):
row = self.cursor.fetchall()
return row
else:
self.db.commit()
return True
except pymysql.err.MySQLError as e:
errorprint(e)
return False
def closeDB(self):
self.cursor.close()
self.db.close()
핵심은 host, user, passwd, db 의 디폴트값을 정했다는 것이다.
어차피 규모가 적당한 한 프로젝트에서
디비는 거의 한군데에서 끌어올텐데,
이 정보를 default값으로 해놓으면 할 때마다 정보를 입력할 일이 없겠다.
에러처리는 MySQLError 만 해놨는데,
추가적으로 본인이 잡고싶은 에러들을 처리해주면 된다
사용법은 위 코드를 db.py에 선언했다고 하자.
이하는 외부 파일의 샘플코드이다.
from db import newDB
mydb = newDB()
sql = "select * from test_table"
result = mydb.executer(sql)
mydb.closeDB()
이 4줄로 result를 가져올 수 있다.
fetchall 으로 실행하게끔 되어있는데,
fetchone 을 원한다면
result = mydb.executer(sql)[0]
을 하면 된다는 말씀!
만약 select가 아닌 insert, update, delete라면?
from db import newDB
mydb = newDB()
sql = "insert into test_table values(어떤 값)"
mydb.executer(sql)
mydb.closeDB()
흐음...
사실 그렇게 마음에 들진 않는다.
이 코드는 여타 모든 것들이 에러가 없을 때 정확하게 잘 돌아가지만,
select문일 때 result는 list가 들어가고,
그 이외엔 boolean이 들어간다.
select문을 쓰고 result 변수를 list 를 쓰듯이 코드를 짜면,
왜 boolean 값으로 list 처럼 갖고 노냐고 에러가 뜬다.
내 코딩실력처럼 코묻은 신입의 냄새가 나지만...
필요한 사람이 적당하게 써서 도움이 된다면!
반응형
'개발 > Python & Flask' 카테고리의 다른 글
[Python] Outlook 메일 자동 읽어오기 (0) | 2021.01.11 |
---|---|
Python logging 에 원하는 값 찍기 (inject variable to logging) (0) | 2020.11.13 |
Python 전역변수 다루기 (0) | 2020.11.13 |
pymysql exception error (예외 처리 정리 및 해석!) (0) | 2020.11.10 |
logging에 필터추가하기! 초간단 예시 (0) | 2020.11.10 |