SQLite3 DB 파일 유효성 검사

초기 버전의 '로또 번호 생성기'는 당첨번호를 DB가 아닌 파일로 저장하였고, SQLite를 사용하여 당첨번호를 파일인 아닌 DB에 저장하는 방식으로 변경하였다.

 

당첨번호를 파일에서 SQLite DB로 변경하는 과정에서 파일명을 변경하지 않아 기존 파일을 SQLite에서 읽었을 때 아래와 같은 에러가 발생하였다.

이것은 DB 파일이 SQLite 형식이 아니기 때문에 발생한 에러이며, SQLite에서 DB 파일을 읽기 전에 정상적인 DB 파일인지 확인할 필요가 있다. 만약 DB이 잘못된 파일이면 제거하고 다시 DB 파일을 생성해야 한다.

 

다행이 SQLite3 DB 파일은 첫 16바이트를 SQLite3 Magic Header를 갖고 있으며, 그 값은 아래 이미지와 같다.

파이썬에서 간단히 Magic Header를 검사하기 위해 사람이 인식 가능한 아스키 코드를 보면 첫 15바이트가 Magic Header로 그 값은 'SQLite format 3'임을 확인할 수 있다.

 

SQLite DB를 사용하기 전에 DB 파일 유효성을 검사가 필요하며, 아래 코드와 같이 간단하게 검사할 수 있다.

class SqlDB(DataBase):
    __file_name    = 'winning_numbers.db'
    __sqlite_magic = [ord(c) for c in 'SQLite format 3']
    
    def __init__(self):
        is_invalid_db = False
        if os.path.exists(SqlDB.__file_name):
            with open(SqlDB.__file_name, 'rb') as f:
                magic_header = list(f.read(15))
                if SqlDB.__sqlite_magic != magic_header:
                    is_invalid_db = True
            
            if is_invalid_db: os.remove(SqlDB.__file_name)
        
        self.__last_episode = 0
        self.__conn = sqlite3.connect(SqlDB.__file_name)
        self.__cursor = self.__conn.cursor()
        self.__cursor.execute('')
        ...

위 코드는 SqlDB를 생성할 때 DB 파일의 SQLite Magic Header가 동일하지 않으면 삭제하여 sqlite3.connect()에서 발생한 에러 대신 새로운 DB 파일을 생성되도록 수정한 것이다.

 

그런데 실제 DB 파일에 대한 유효성 검사는 어떻게 하는지 나중에 확인을 해봐야 겠다.