Python/Python__works

fetchone() 분실 사건

말하는감자 2020. 9. 22. 18:23
import pymysql

conn = pymysql.connect(=host=127.0.0.1, port=3306, user=root, 
password=123456, db="test", charset="utf8mb4", 
cursorclass=pymysql.cursors.DictCursor, autocommit=True)
cursor = conn.cursor()

select_one = "SELECT * FROM test_table WHERE no=1"

# 첫번째 execute -----
cur.execute(select_one)
result = cur.fetchone() if cur.fetchone() else ''

# 두번째 execute -----
cur.execute(select_one)
row = cur.fetchone()
result = row if row else ''

해당 쿼리에 정확한 값이 들어있다고 가정했을 때, 첫번째 execute와 두번째 execute는 동일하게 동작할까요?

 

정답은 두가지입니다.

  • 그렇다
  • 아니다

return cur.fetchone() if cur.fetchone() else ''

간단한 select 같은 경우에는 최대한 간단하면서도 간결하게 처리하기 위해서 위와 같은 구문을 많이 썼는데요, 저 구문이 동작하는 경우도 물론 많았습니다.......... 근데 그게 오류였어요 ㅋㅋㅋㅋㅋ 오류지만 맞는 값을 줄 때도 있으니 정답은 네니요....

테이블에 1번 row 하나만 있을 때 fetchone은 해당 구문을 셀렉트해서 들고 있습니다. 그리고 포인터는 거기에 멈춰있을거에요.
근데 저 구문에서는 fetchone을 두번 사용했잖아요.....?
즉 1번을 찾은 후에 멈춰있던 포인터가 다음 값을 찾기 위해서 움직여봤자 2번 값은 없으니까 None을 리턴한거죠

 

row = cur.fetchone()
result = row if row else ''

앞으로는 위와 같이 써주는걸로 :)

 

 

stackoverflow.com/questions/48143659/cursor-fetchone-returns-none-even-though-a-value-exists

 


'Python > Python__works' 카테고리의 다른 글

datetime 활용하기  (0) 2020.09.24
실행 중인 메서드이름, 파일 이름  (0) 2020.09.24
python slacker  (0) 2020.06.11
no module named mysqldb  (0) 2020.03.30
sqlalchemy  (0) 2020.03.04