오랜만에 엑세스 DB를 핸들링할 일이 생겨서 파이썬으로 다루는 법을 찾아보니

라이브러리가 몇가지 있는데 그중에서 pyodbc가 사용하기 좋아보여 선택하고 간단한 템플릿을 작성해보았다.

 

의외의 상황이 발생해 약간 시간을 소비하긴 했지만 기본적으로는 어렵지 않게 구성할 수 있었고

특별히 복잡한 데이터 핸들링이 아니라면 금방 원하는 코드를 작성할 수 있을 것 같다.

 

참고해야할 사항만 몇가지 적어둔다.

 

당연히 pyodbc 설치가 먼저 선행해야 한다.

 

pip install pyodbc

 

pip가 설치되어있다면 위와 같이 설치할 수 있다.

아나콘다에서 conda 명령으로는 설치가 안되는 것 같다.

 

pyodbc의 공식 github

https://github.com/mkleehammer/pyodbc

 

GitHub - mkleehammer/pyodbc: Python ODBC bridge

Python ODBC bridge. Contribute to mkleehammer/pyodbc development by creating an account on GitHub.

github.com

 

1. DB 연결하기

import pyodbc

conn = pyodbc.connect(r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=.\test.mdb;PWD=mypassword;')
cursor = conn.cursor()
for row in cursor.tables():
    print(row.table_name)

 

연결 문자열은 ODBC기본 문자열을 그대로 사용하면 된다. 비밀번호가 있다면 PWD=; 에 작성

연결하고 커서를 읽어오면 커서에 기본 데이터베이스 정보를 출력해볼 수 있다.

위의 예제는 테이블 이름을 모두 출력

 

2. 컬럼 읽어오기

for cols in cursor.columns(table='Agent'):
    print(cols.column_name)

 

위의 예제는 컬럼명만 읽어오도록 되어있지만 pyodbc 공식 매뉴얼을 참조하면 다양한 컬럼 속성들도 읽어올 수 있다.

 

3. SELECT로 쿼리

 

cursor.execute('select * from Agent')

for row in cursor.fetchall():
    print (row)

SQL SELECT구문을 사용해 테이블 정보를 읽어오는 간단한 예제이다.

 

fetchone을 이용해 하나씩 읽어오기도 가능하다.

 

4. INSERT로 데이터 삽입

try:
    conn.autocommit = False
    params = [('bicycle', 499.99), ('ham', 17.95)]
    cursor.executemany("insert into t(name, id) values (?, ?)", params)
except pyodbc.DatabaseError as err:
    print(err.__cause__)
    print(err.__context__)
    print(err.__doc__)
    print('Error Rollback !!!')
    conn.rollback()
else:
    print('commit sucess !!!!')
    conn.commit()
finally:
    conn.autocommit = True

데이터 입력 또는 삽입에 대한 기본 패턴이다.

cursor.execute로 단일 데이터 처리도 가능하고 리스트를 이용해 일괄 처리도 가능하다.

 

내 경우는 여기서 문제가 발생했었는데 insert문이 정상처리 안되고 계속 예외처리로 빠져나온다.

파라미터 문제라고 나오는데 이것저것 바꿔봐도 해결이 안되서 엑세스를 열고 직접 쿼리문을 입력해보니 아래 그림처럼 오류부분이 표시된다.

 

Group 이라는 필드가 존재하는 테이블인데 아마도 엑세스에서는 Group이라는 명칭을 필드에 사용하는게 안되는 것 같다.

파일이 만들어진지 오래된 것이라 과거 버전과 다른 것일지도 모르겠다.

 

어찌되었든 해당 필드에 값을 입력해야 하니 꽁수로 선택한 방법은

필드명을 생략하고 테이블명만 지정해 전체 필드값을 모두 파라미터로 지정하니 정상적으로 잘 들어간다.

try:
    conn.autocommit = False
    params = [('bicycle', 499.99), ('ham', 17.95)]
    cursor.executemany("insert into t values (?, ?)", params)
except pyodbc.DatabaseError as err:
    print(err.__cause__)
    print(err.__context__)
    print(err.__doc__)
    print('Error Rollback !!!')
    conn.rollback()
else:
    print('commit sucess !!!!')
    conn.commit()
finally:
    conn.autocommit = True

필드명에 Group이 없었다면 겪지 않을 일이었을 지도 모르지만 기록으로 남겨둔다.

 

Posted by 휘프노스
,