pymysql 사용 예제

Photo by Mika Baumeister on Unsplash


pymysql을 이용하여 mysql에 데이터를 넣는 코드를 작성했다. 

1
2
3
4
5
6
7
8
apt = '아크로리버파크'
price = 300000

with connection:
    with connection.cursor() as cursor:
        # Create a new record
        sql = "insert into kb_market_price ( apt_nm, apt_price ) values ( %s, %d )"
        cursor.execute(sql, (apt, price))

실행을 하니 TypeError가 발생했다.

TypeError: %d format: a number is required, not str

number가 필요하다고? 테이블의 apt_price 컬럼은 int 형이고, price도 int 형인데? 가이드 문서는 너무 간단해서 이유를 찾을 수 없었다. GitHub 페이지에 가보니 stackoverflow를 참고하라고 써놨다. 이것도 괜찮은 방법이네. 

stackoverflow에서 검색해 보니, 자료형 상관없이 모든 필드에 %s를 쓰는 거라고 한다.

1
2
3
        # Create a new record
        sql = 'insert into kb_market_price ( apt_nm, apt_price ) values ( %s, %s )'
        cursor.execute(sql, (apt, price))

그렇구나. %s는 문자열 타입이라 지레 짐작하고, %d로 쓴 것이 잘못이었다. 나만 그렇게 생각했던 건 아닌가보다. 

궁금한 점이 하나 생겼다. price = 300000 대신 price = '300000'으로 작성하면 오류가 날까? 쿼리와 변수값을 바인딩하고 DB에 요청하는 시점에는 테이블의 컬럼 타입을 알 수 없다. 그러니 자료형이 틀리다는 에러가 발생할 것이라고 생각했다. 

그러나 결과는 정상이다. 어떻게 이런 결과가 나올 수 있을까? 신기해서 price에 한글, 영문 등 문자열을 넣고 실행했더니 아래와 같은 오류가 발생했다.

pymysql.err.DataError: (1366, "Incorrect integer value: '이십일' for column 'apt_price' at row 1")

Python에서 알아서 변환하지는 못할 것 같고, MySql에서 형 변환이 가능한 경우에는 자동으로 처리해 주는 것이 아닐까 짐작해 본다. 


댓글 쓰기

0 댓글