Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 봉준호감독통역사
- 코로나19
- 조현병
- 우한
- red hearse
- 우한코로나
- 전염병
- 필리핀사망
- Bolton
- cnn
- 봉준호감독통역
- 웨일즈
- wuhan
- 우한 코로나
- 미중
- 최성재
- 진짜영웅
- 우한코로나바이러스
- 정은경 본부장님
- everybody wants you
- 신종코로나
- 중국외교부
- 치앙마이
- 확진자수
- 창궐
- parasite
- 코로나바이러스
- 어서와한국은처음이지
- sharonchoi
- 코로나
Archives
- Today
- Total
오지's blog
pymysql.err.Error: Already closed 에러발생 해결과정 본문
728x90
반응형
class MARIADB(DBCON):
def __init__(self, **kwargs):
self.dbms="MARIADB"
self.port = kwargs["port"]
super().__init__(**kwargs)
def connectiondb(self):
try:
self.con = pymysql.connect(host=self.host, user=self.user, password=self.password, database=self.dbname, port=int(self.port), autocommit=True)
return self.con
except Exception as e:
return self.get_error_msg(e)
def version_check(self):
self.version_query = "SELECT VERSION()"
with self.con:
with self.con.cursor() as cur:
sql = self.version_query
cur.execute(sql)
version = cur.fetchone()
return self.get_version_info(version)
def exec_query(self):
sql = """select * from tbl2"""
with self.con as con:
with con.cursor() as cur:
print("sql test")
cur.execute(sql)
result = cur.fetchone()
print("sql test")
print(result)
return result
if __name__ == "__main__":
con_info=get_dict("secret.json")
maria_db = MARIADB(host=con_info["MARIADB_HOST"],
user=con_info['MARIADB_USER'],
password=con_info['MARIADB_PASSWORD'],
dbname=con_info['MARIADB_DBNAME'],
port=con_info['MARIADB_PORT'])
maria_db.version_check()
maria_db.exec_query()
{
"MARIADB_HOST": "127.0..0.1",
"MARIADB_USER": "testuser",
"MARIADB_PASSWORD": "testpassword",
"MARIADB_DBNAME": "test",
"MARIADB_PORT": "3306"
}
소스는 다음과 같고, secret.json에 데이터 베이스 연결정보가 정확하다는 가정하에 다음과 같은 에러가 발생한다.
raise err.Error("Already closed")
pymysql.err.Error: Already closed
이상하다... 잘못한거 없는거 같은데..
db연결하고,
연결이 잘되었는지 버전확인하고,
쿼리문 날려서 결과 보고..
프로그램이 실행되면서 프로세스가 생성되고
main함수에서 디비에 연결하고, 버전확인하고, select절 날려보고..
여기서 디비에 연결후 확인하는 과정에서 with절을 주목해야 한다.
버전확인하는 과정에서
with self.con:
with self.con.cursor() as cur:
sql = self.version_query
cur.execute(sql)
version = cur.fetchone()
이부분과 select날리는 과정에서
with self.con as con:
with con.cursor() as cur:
print("sql test")
cur.execute(sql)
result = cur.fetchone()
print("sql test")
print(result)
return result
이부분이다.
with절에서 이미 connection을 닫았는데 다시 connection을 열었다.
여기서 문제였다.
그렇다면 어떻게 해결할까?
with절이 시작되면 연결이 설정되고 with절이 끝나면 연결이 해제되기 때문에 with절 열때마다 db를 연결하면된다.
다음과 같이..
class MARIADB(DBCON):
def __init__(self, **kwargs):
self.dbms="MARIADB"
self.port = kwargs["port"]
super().__init__(**kwargs)
def connectiondb(self):
try:
self.con = pymysql.connect(host=self.host, user=self.user, password=self.password, database=self.dbname, port=int(self.port), autocommit=True)
return self.con
except Exception as e:
return self.get_error_msg(e)
def version_check(self):
self.version_query = "SELECT VERSION()"
with self.connectiondb() as con:
with con.cursor() as cur:
sql = self.version_query
cur.execute(sql)
version = cur.fetchone()
return self.get_version_info(version)
def exec_query(self):
sql = """select * from tbl2"""
with self.connectiondb() as con:
with con.cursor() as cur:
cur.execute(sql)
result = cur.fetchone()
print(result)
return result
전체소스는 제 깃으로
'개발노트 > Python' 카테고리의 다른 글
freeCodeCamp.org의 python immediate 연습 (0) | 2021.08.29 |
---|---|
진료행위정보서비스 크롤러 개발중 해결한 selenium을 이용한 년월 선택문제 (0) | 2021.07.04 |
python에서 super()와 부모클래스이름(parent class name)의 차이점 (0) | 2021.04.07 |
folium popup size 수정하는 방법 (0) | 2021.03.21 |
github에 코드 올릴때 key값을 숨기는 방법 - python 이용 (0) | 2021.03.20 |
Comments