본문 바로가기

파이선 (python)

[Python] MS Access DB 사용 방법

728x90

[ 개요 ]

* python 프로그램에서 간단한 database를 필요로 할 때가 많다.

* 개인이 가장 쉽게 접할 수 있는 Microsoft의 Access를 사용하는 방법을 정리해 보고자 한다.

 

[ 따라해보기 ]

1) pyodbc 라이브러리를 설치한다.

* command 창에 'pip install pyodbc' 입력하면 끝~

* pyodbc는 Python과 SQL Server, MySQL, Oracle, PostgreSQL 등 다양한 database를 연결할 수 있는 라이브러리이다.

 

2) pyodbc를 사용하여 MS Access DB에 연결한다.

import pyodbc

# 데이터베이스 연결 문자열
connection_string = "Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\Project\ApServer\\testDB.accdb"

# 데이터베이스에 연결
conn = pyodbc.connect(connection_string)

# 연결 확인
print(f'conn:{conn}');

print(f'waitting 3sec...');
time.sleep(3);

<처리결과>

conn:<pyodbc.Connection object at 0x00000256CCADE730>
waitting 3sec...

* database에 정상 연결되면 위와 같이 나온다.

* 만약, 해당 파일이 없으면 아래와 같이 나올 것이다.

pyodbc.Error: ('HY000', "[HY000] [Microsoft][ODBC Microsoft Access 드라이버] '(알 수 없음)' 파일을 찾을 수 없습니다. (-1811) (SQLDriverConnect); [HY000] [Microsoft][ODBC Microsoft Access 드라이버] '(알 수 없음)' 파일을 찾을 수 없습니다. (-1811)")

 

3) 만약, testDB.accdb 파일이 없다면 MS Access 프로그램을 사용하여 아래와 같은 테이블을 생성하고 'testDB'로 저장한다. 

* 해당 파일의 위치하는 경로명이 위 예제("C:\Project\ApServer\\testDB.accdb")와 다를 경우 소스 코드를 수정하면 된다.

* 아래에 첨부된 파일은 예제용 Sample database이다.

testDB.accdb
0.59MB

 

 

4) 이제 데이터베이스 SELECT 쿼리를 테스트한다.

# 데이터베이스 데이터 읽기
cursor = conn.cursor()
print(f'<SELECT 예제>');
cursor.execute("SELECT * FROM 거래내역")

# 쿼리 결과 출력
for row in cursor:
    print(row)
print(f'waitting 3sec...');
time.sleep(3);


<처리결과>

<SELECT 예제>
(1.0, '이체', datetime.datetime(2019, 12, 31, 0, 0), '신한예금', -300000.0)
(2.0, '이체', datetime.datetime(2019, 12, 31, 0, 0), '신한적금', 300000.0)
(3.0, '이체', datetime.datetime(2019, 12, 31, 0, 0), '농협예금', -300000.0)
(4.0, '이체', datetime.datetime(2019, 12, 31, 0, 0), '농협적금', 300000.0)
(5.0, '지출', datetime.datetime(2019, 12, 31, 0, 0), '신한예금', -96194.0)
(6.0, '지출', datetime.datetime(2019, 12, 31, 0, 0), '신한예금', -200.0)
(7.0, '수입', datetime.datetime(2019, 12, 31, 0, 0), '농협예금', 159303.0)
(8.0, '수입', datetime.datetime(2019, 12, 29, 0, 0), '신한예금', 585.0)
waitting 3sec...

* Access DB의 내용과 동일함을 확인할 수 있다.

 

5) 데이터베이스 UPDATE 쿼리를 테스트한다.

# 데이터베이스 데이터 수정
print(f'<UPDATE 예제>');
cursor.execute("UPDATE 거래내역 SET 계정 = '임시계좌' WHERE ID = 1")

# 쿼리 결과 출력
cursor.execute("SELECT * FROM 거래내역")
for row in cursor:
    print(row)
print(f'waitting 3sec...');
time.sleep(3);

<결과출력>

<UPDATE 예제>
(1.0, '이체', datetime.datetime(2019, 12, 31, 0, 0), '임시계좌', -300000.0)
(2.0, '이체', datetime.datetime(2019, 12, 31, 0, 0), '신한적금', 300000.0)
(3.0, '이체', datetime.datetime(2019, 12, 31, 0, 0), '농협예금', -300000.0)
(4.0, '이체', datetime.datetime(2019, 12, 31, 0, 0), '농협적금', 300000.0)
(5.0, '지출', datetime.datetime(2019, 12, 31, 0, 0), '신한예금', -96194.0)
(6.0, '지출', datetime.datetime(2019, 12, 31, 0, 0), '신한예금', -200.0)
(7.0, '수입', datetime.datetime(2019, 12, 31, 0, 0), '농협예금', 159303.0)
(8.0, '수입', datetime.datetime(2019, 12, 29, 0, 0), '신한예금', 585.0)
waitting 3sec...

* 1번째 레코드의 계정 항목에 '임시계좌'로 변경되어 있음을 확인할 수 있다.

 

6) 데이터베이스 INSERT 쿼리를 테스트한다.

# 데이터베이스 데이터 삽입
print(f'<INSERT 예제>');
cursor.execute("INSERT INTO 거래내역 (ID, 거래구분, 거래일자, 계정) VALUES ('9', '수입', '2024-12-28', '임시계좌')")

# 쿼리 결과 출력
cursor.execute("SELECT * FROM 거래내역")
for row in cursor:
    print(row)
print(f'waitting 3sec...');
time.sleep(3);

<결과출력>

<INSERT 예제>
(1.0, '이체', datetime.datetime(2019, 12, 31, 0, 0), '임시계좌', -300000.0)
(2.0, '이체', datetime.datetime(2019, 12, 31, 0, 0), '신한적금', 300000.0)
(3.0, '이체', datetime.datetime(2019, 12, 31, 0, 0), '농협예금', -300000.0)
(4.0, '이체', datetime.datetime(2019, 12, 31, 0, 0), '농협적금', 300000.0)
(5.0, '지출', datetime.datetime(2019, 12, 31, 0, 0), '신한예금', -96194.0)
(6.0, '지출', datetime.datetime(2019, 12, 31, 0, 0), '신한예금', -200.0)
(7.0, '수입', datetime.datetime(2019, 12, 31, 0, 0), '농협예금', 159303.0)
(8.0, '수입', datetime.datetime(2019, 12, 29, 0, 0), '신한예금', 585.0)
(9.0, '수입', datetime.datetime(2024, 12, 28, 0, 0), '임시계좌', None)
waitting 3sec...

* 맨 아래에 9번째 레코드가 추가되어 있음을 확인할 수 있다.

 

7) 데이터베이스 DELETE 쿼리를 테스트한다.

# 데이터베이스 데이터 삭제
print(f'<DELETE 예제>');
cursor.execute("DELETE FROM 거래내역 WHERE ID = 9")
# 쿼리 결과 출력
cursor.execute("SELECT * FROM 거래내역")
for row in cursor:
    print(row)
print(f'waitting 3sec...');
time.sleep(3);

<결과출력>

<DELETE 예제>
(1.0, '이체', datetime.datetime(2019, 12, 31, 0, 0), '임시계좌', -300000.0)
(2.0, '이체', datetime.datetime(2019, 12, 31, 0, 0), '신한적금', 300000.0)
(3.0, '이체', datetime.datetime(2019, 12, 31, 0, 0), '농협예금', -300000.0)
(4.0, '이체', datetime.datetime(2019, 12, 31, 0, 0), '농협적금', 300000.0)
(5.0, '지출', datetime.datetime(2019, 12, 31, 0, 0), '신한예금', -96194.0)
(6.0, '지출', datetime.datetime(2019, 12, 31, 0, 0), '신한예금', -200.0)
(7.0, '수입', datetime.datetime(2019, 12, 31, 0, 0), '농협예금', 159303.0)
(8.0, '수입', datetime.datetime(2019, 12, 29, 0, 0), '신한예금', 585.0)
waitting 3sec...

* 6) 번 항목에서 추가했던 9번째 레코드가 지워진 것을 확인할 수 있다.

 

생각보다 간단한 듯...