콘텐츠로 건너뛰기
Home » [Python] SQLite3 DB의 테이블 칼럼 이름 알아내기

[Python] SQLite3 DB의 테이블 칼럼 이름 알아내기

테이블의 칼럼 이름을 기억하기 힘든 경우에는  CREATE TABLE 명령을 따로 복사해서 보관하거나,  아예 종이에 출력해 두기도 하는데 만약 내가 만든 테이블이 아닌 경우에는 SQLite3 쉘을 실행해서 .schema 명령으로 테이블 스키마를 확인해야 한다. (사실 이것도 상당히 바람직한 방법인데, 윈도 시스템에서 이 작업을 할 수 있는 방법에 대해서는 조만간 다시 글을 하나 쓸 생각이다.)
어쨌든 이번에는  파이썬에서 sqlite 테이블의 칼럼 이름들만 뽑아내는 방법을 소개한다. DB 커넥션 객체의 row_factory를 이용하는 데, 기본으로 이 속성은 None으로 지정되어 있다. 커서를 생성하기 전에 sqlite3.Row 클래스로 지정해주면 상당히 편리하게 작용하게 된다. 간단한 예제를 살펴보자.
row_factory가 지정된 연결의 커서로 SELECT 문을 수행하면 fetch 되는 각각의 row 의 데이터는 Row 클래스의 객체가 되고, 이 객체를 통해 튜플 형식이 아니라 사전과 비슷하게 키-값 쌍으로 검색해온 데이터에 접근할 수 있게된다.
이 때 Row의 키가 테이블의 칼럼이 되므로 .key()  메소드를 통해 칼럼 이름 전체를 얻을 수 있다.
아무튼 다음 코드는 놀랄만큼 평범하면서 많은 장점을 가져다주므로, 한 번 눈여겨 봐둘 필요가 있다.

#! C:/python27/python.exe
import sqlite3 as lite
database_filename = 'test.db'
conn = lite.connect(database_filename)
conn.row_factory = lite.Row
cs = conn.cursor()
cs.execute('SELECT * FROM t1')
r = cs.fetchone()
print r
print r['name']
print type(r)
print r.keys()

“[Python] SQLite3 DB의 테이블 칼럼 이름 알아내기”의 8개의 댓글

  1. 혹시 이 방식과 비슷하게 db 안에 존재하는 테이블명도 가져올 수 있을까요??

    1. 모든 sqlite3 DB는 SQLITE_MASTER 라는 테이블을 가지고 있습니다.
      SELECT name FROM SQLITE_MASTER WHERE type=”table”

      1. 이 쿼리로 작성하여서 출력하면 유니코드 방식으로 출력되서 나오더라구요..
        text_factory 를 str로 변경하면 문자열로 나오긴 하는데 코드 작성하는데 계속 에러가 나서 혹시 다른방법이 있나 여쭈어 보았습니다..

      2. 질문 하나만 더 드려도 될지 모르겠네요.. 밑 부분인 ‘r = cs.fetchone() 부분에서 NoneType 이 발생하는 경우가 있는데 이건 혹시 무엇이 원인인지 알 수 있을까요??

        1. 쿼리 결과보다 많은 행을 가져오려는 경우, 더이상 가져올 row가 없을 때 그렇습니다.

          1. 제가 한 테이블이 아닌 반복문을 통해서 하나의 db 파일의 모든 테이블의 모든 컬럼 목록을 가져올려고 하는데요 이럴 경우에 NoneType이 발생할수 있는건가요?? 혹시 그렇다면 어느 부분을 수정해야 하는지 참조 할 수 있을까요??

            1. 커서를 두개 쓰면 되지 않을까요.
              c_t = db.cursor()
              c.execute(‘SELECT name FROM SQLITE_MASTER WHERE type = “table”
              )
              while True:
              tablename = c.fetchone()
              if not tablename:
              break
              c_cols = db.cursor()
              c_cols.row_factory = sqlite3.Row
              c_cols.execute(‘SELECT * FROM {} LIMIT 1’.format(tablename[0]))
              ..

              1. 처음부터 커서 2개를 사용하고 있었는데 원인이 다른데 있었네요.. db 파일안에 row 값이 없는 테이블이 있어서 그런거네요.. key는 있지만 value 가 없어서 못불러오는 거였네요.. 다른 방법으로 찾아봐야할지 고민 해봐야겠네요…

      댓글이 닫혔습니다.