[ 개요 ]
* 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이다.
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번째 레코드가 지워진 것을 확인할 수 있다.
생각보다 간단한 듯...
'파이선 (python)' 카테고리의 다른 글
[Python] Twilio를 이용한 무료 SMS 보내기 (0) | 2024.05.30 |
---|---|
[Python] 내 PC의 내부 및 외부 IP Address 구하기 (0) | 2024.05.30 |
[Python] 함수/변수 및 클래스 네이밍 표기법 (1) | 2024.01.03 |
[Python] 비동기(Async) 방식 프로그램을 구현해보자 (2) | 2023.10.03 |
[Python] 스레드(Thread)를 구현해보자 (0) | 2023.10.03 |