본문 바로가기
파이썬

The default datetime adapter is deprecated.Deprecation Warning.

by 진심블로그 2024. 3. 5.

안녕하세요. 파이신입니다.

 

파이썬 sqlite3에서 코딩 시에 나타나는 오류에 대해서 다룹니다.

 

- 본 글은 파이썬 중급자 이상이 읽기에 적합합니다

- 아래 코드로 가면 바로 해결방안을 볼 수 있습니다

 

2024년 3월 기준, 파이썬의 최신 버전은 3.12입니다.

더 정확하게는 3.12.2이지만 3.12 이하의 마이너는 별다른 영향이 없습니다

sqlte3의 버전은 말 그대로 3입니다.

sqllite3은 PEP249에서 설명하는 DB-API 2.0을 따르는 인터페이스를 제공합니다.

 

sqlite3는 파이썬에서 사용하는 라이브러리인데,

이 sql이라는 것이 처음부터 파이썬을 위해 설계된 것이 아닙니다.

sql db에는 여러 형태가 많은데, 이 것들 중 파이썬을 위해 만들어 제공하는 것이

sqlite3라는 라이브러리일 뿐입니다.

당연히 sqlite3를 설계하고 만들 때는 기존의 데이터포맷과 파이썬에서 다루는

데이터포맷을 최대한 호환되도록 만들었습니다.

하지만 sqlite3 뿐만 아니라 모든 라이브러리들이 최신기술과 흐름에 따라

업데이트를 통해 자신들의 데이터 포맷이나 인터페이스 등을 변경하게 됩니다.

 

sqlite3도 당연히 이런 업데이트 내용이 있습니다.

이 중에는 위 제목의 datetime관련 warning도 있습니다.

 

사실 여러 warning 중에 deprecation warning의 경우,

당장 코딩을 할 때는 전혀 문제가 되지 않습니다.

 

코딩을 마치고 배포를 할 때도 문제가 되지 않습니다.

 

내가 지금 사용하고 있는 파이썬 버전과 sqlite3 버전을 그대로 패키징 해서

배포하는 것이니, 전혀 문제가 되지 않는다는 뜻입니다.

 

그렇지만 장기적으로 볼 때 몇 가지 문제가 있습니다.

- 우선, 코딩할 때마다 터미널에 출력되는 warning이 눈에 거슬립니다

- 시간이 지난 후에 나도 모르게 sqilte3 라이브러리를 업데이트하거나,

파이썬 및 기타 라이브러리를 재설치하거나,

가상 환경에서 다른 버전을 사용한다거나 할 때,

코드가 아예 동작하지 않는 경우가 생길 수 있습니다.

즉, 코드만 생각하기에도 정신이 없는데,

사용한 라이브러리 버전까지도 함께 생각해야 하는 것은 쓸데없는 일입니다.

대부분의 경우 최신 라이브러리를 사용하는 것이 좋습니다

- 최신 라이브러리에 맞게 파이썬 자체가 수정되는 경우, 시간이 오래 지나면,

에러 발생 시, 디버깅 자체가 곤란해질 수 있습니다.

 

위와 같은 이유로 코딩을 하면서 나타나는 dreprecation warning의 경우,

문제를 바로 해결하는 것을 추천합니다.

 

위의 경우 warning이라고 직접적으로 표시하지는 않지만, warning입니다.

 

이런 경우 우선, 다음의 코드를 삽입합니다.

 

def adapt_date(val):
    return val.isoformat()


def convert_date(s):
    return datetime.date.fromisoformat(s.decode('ascii'))


def adapt_datetime(val):
    return val.isoformat(' ')


def convert_datetime(s):
    return datetime.fromisoformat(s.decode('ascii'))


sqlite3.register_adapter(datetime.date, adapt_date)
sqlite3.register_adapter(datetime, adapt_datetime)

sqlite3.register_converter("date", convert_date)
sqlite3.register_converter("timestamp", convert_datetime)

 

위 코드에서는 총 4개의 함수를 만들었습니다.

처음 2개는 date type의 adapter와 converter이고,

다음 2개는 datetime type의 adapter와 converter입니다.

 

이 4개를 각각 sqlite3에 adapter와 converter로 등록합니다.

 

이렇게 하는 이유는,

현재 파이썬에서 제공하는 datetime 라이브러리의 데이터를 현재는 인식하지만,

나중에는 인식하지 않을 것이라고 경고했기 때문입니다.

이렇게 하면 파이썬이 제공하는 datetime type을 sqlite3가 인식하는 type으로

바꾸어 줍니다. 앞으로도 계속 문제없이 사용할 수 있다는 뜻입니다.

 

자세한 설명은 위 코드를 읽어보며 천천히 이해하기 바랍니다만,

그냥 넘겨도 앞으로 사용하는데 전혀 문제가 없습니다.

 

이렇게 sqlite3에 등록을 하고 난 후,

실제 db를 사용할 때는 아래 코드와 같이 사용합니다.

 

def saveInfo(classInfo):
    with sqlite3.connect(DATABASE_NAME,
    		detect_types=sqlite3.PARSE_DECLTYPES | sqlite3.PARSE_COLNAMES) as conn:
        cur = conn.cursor()        
        ..
        ..

 

connect의 옵션 중 PARSE_DECLTYPES는 db 테이블의 각 열이 가지고 있는 type을 가져옵니다.

즉, 보통 사용하는 자동증가 키의 type을 integer primary key와 같이 해 놓으면 int를 가져옵니다.

여기서 중요한 것이,

type을 가져온 다음, 해당 열에 대해,

변환기 딕셔너리를 조사하고 그 type에 대해 등록된 변환기 함수를 사용합니다.

여기서 사용되는 것이 우리가 이전에 등록했던 함수들입니다

 

PARSE_COLNAMES는 각 열의 열 이름을 구문 분석합니다.

즉, name [datetime]과 같은 열의 값이 있으면 [] 안을 제외하고 name만 가져온다는 뜻입니다.

 

위와 같이 설정하면 deprecation warning은 사라집니다.

 

여담이지만,

코딩 시에 나타나는 각종 warning들이 당장 실행에는 문제가 되지 않으니

그냥 지나가는 프로그래머들을 많이 보았습니다.

 

모든 warning에는 반드시 이유가 있기 마련입니다.

 

반드시 해결하는 습관을 가지기 바랍니다.

 

요즘 시대에 프로그래머는 모든 코딩을 다 직접 만들 필요도 없고,

그럴 이유도 사라지는 것이 사실이지만,

자신이 만든 코드에서 만큼은 결벽증을 가지는 것이

상위 0.1%의 프로그래머로 성장하는데 분명히 도움이 됩니다.

 

댓글과 구독은 글을 연재하는데 힘이 됩니다.