오픈소스에 기여 - python mysql driver

한줄짜리 코드이지만, 장고에서도 추천하는 파이썬 mysql 드라이버에 기여했다.

파이썬 3.5에서 제대로 동작하는 mysql 드라이버가 없어서 한참동안이나 문제였는데, 2.7에서도 많이 쓰이던 pymysql 이 언젠가부터 3.5를 지원하기 시작했다.

프로덕션에도 도입하기로 하고 잘 사용하고 있었는데, stored procedure 에서 문자열을 인자로 주는 경우, 이 문자열에 한글을 넣으면 surrogates not allowed 라는 익셉션이 발생했다.

처음에는

def literal(self, o):
    s = self.escape(o, self.encoders)
    if not PY2 and isinstance(s, bytes):
        return s.decode('ascii', 'surrogateescape')
    return s

def literal(self, o):
    s = self.escape(o, self.encoders)
    if not PY2 and isinstance(s, bytes):
        return s.decode('utf8', 'surrogateescape')
    return s

로 decode 의 인자만 바꾸어서 문제를 해결하려고 했다.

애초에 decode 에 인자를 ‘ascii’라고 박아놓았는데, 저 부분을 고치는 것은 다른 부작용을 만들 것 같았다. ’ascii’ 를 사용한 것에 이유가 있을지도 모르고, 게다가 깃헙에서 수정중인 코드에서는 literal() 을 더 복잡하게 구현해두어서, 내가 손대면 안될 것 같았다.

더 뒤져본 결과, callproc()에서 literal() 호출 후에 encode()를 한번 더 호출하고 있었고, 여기에도 ‘surrogateescape’옵션이 빠져있었다. 이쪽을 고치는 것이 원소스 작성자의 의도와 맞는 것으로 판단했다. 이번에는 이슈만 올리는게 아니라 소스를 수정하고, pull request 를 생성했다.

처음 발견하고 literal쪽에 의견을 준것이 6월8일, callproc()을 수정해서 pr 한것이 6월9일, 감사하다는 인사와 함께 머지된 것은 6월말. 약 3주만에 받아들여졌다.

아래는 깃헙에 머지된 한 줄의 코드.

작은 부분이지만, 많은 사람들이 쓰는 코드에 기여했다는 기쁨이 크다. 더 많이 하고 싶다. :)