본문 바로가기

개발/Python & Flask

pymysql 사용법, 간편한 축약 코드 예시!

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 처럼 갖고 노냐고 에러가 뜬다.

 

 

내 코딩실력처럼 코묻은 신입의 냄새가 나지만...

필요한 사람이 적당하게 써서 도움이 된다면!

반응형