본문 바로가기
SW 개발/Data 분석 (RDB, NoSQL, Dataframe)

MariaDB의 Python Connector 설치와 사용 방법

by Kibua20 2021. 6. 5.

MariDB Programming Language / InterfaceConnector

DB 서버에 MariaDB를 설치(링크)하고 Client에서 DB를 사용하기 위해서는 Connector를 사용해야 합니다. DB Connector는 아래와 같은 다양한 언어를 지원하고 있고, 각 개발 언어에 맞는 Connector를 사용하면 됩니다.  여러 프로그래밍 언어 중에서 Python으로 MariaDB 연동하는 방법을 설명할 예정입니다.  MariaDB Python connector 사용 방법은 아래 링크에 설명되어 있고 본 포스팅은 아래 MariaDB blog를 실습 후 정리한 내용입니다.

 

 언어 MariaDB Connector 링크 
C MariaDB Connector/C
C++ MariaDB Connector/C++
Java - JDBC MariaDB Connector/J
Java - R2DBC MariaDB Connector/R2DBC
JavaScript MariaDB Connector/Node.js
ODBC MariaDB Connector/ODBC
Python MariaDB Connector/Python

 

MariaDB Python Connector는 MySQL이나 다른 DB서버와 거의 동일한 방법으로 사용할 수 있어 모듈 하나만 사용법을 익히면 다른 SQL DB에서도 거의 그대로 사용하면 됩니다. 

 

MariaDB Python connector 설치

MariaDB Python connector를 설치는 Python package installer인 pip를 통해서 설치 가능합니다.  Python mariadb 모듈은 C connector에 dependency를 가지고 있어 사전에 libmariadb-dev를 설치해야 합니다. 

 

$ sudo apt install libmariadb-dev

$ sudo pip3 install mariadb

 

libmamariadb-dev 설치 없이 Python mariadb connector를 설치하는 경우 아래와 같은 에러 메시지를 출력합니다. 

pip3 install mariadb 설치 시 에러 메시지

 

에러 메시지:

Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-install-ax41g3j5/mariadb/setup.py", line 26, in <module>
        cfg = get_config(options)
      File "/tmp/pip-install-ax41g3j5/mariadb/mariadb_posix.py", line 59, in get_config
        cc_version = mariadb_config(config_prg, "cc_version")
      File "/tmp/pip-install-ax41g3j5/mariadb/mariadb_posix.py", line 28, in mariadb_config
        raise EnvironmentError(
    OSError: mariadb_config not found.

 

해결 책: 

  $ sudo apt install libmariadb-dev

libmariadb-dev 설치 화면

 

MariaDB Python connector 사용 방법

Python으로 MariaDB를 사용하는 방법은 DB connector Instance를 만들고, curosr를 만들고, ③ SQL 구문의 정의하고 실행하여, ④ Fetch를 통해서 Query 결과를 client로 가져옵니다.  ⑤ Query 문에 문제가 없으면 DB에 Query문을 DB에 반영하는 commit()을 실행합니다.  ⑥ 마지막 과정으로 Connection과 Cursor를 모두 사용했다면 메모리를 해제합니다. 

 

Connection은 DB Client와 Server의 연결 관계를 정의하는 객체입니다.  DB Server는 Connection Pool을 가지고 있고, Client에서 connect() 함수 실행 시 DB  서버의 Connection Pool에서 client로 connection을 할당하게 됩니다. DB 서버 입장에서 여러 client와 connection을 가질 수 있습니다.  DB  서버의 부하를 줄이기 위해서는 사용하지 않는 connection은 해제 (=반납)해주시는 것이 좋습니다.  connect() 함수에 의해서 DB Server의 주소, 포트, DB User ID와 패스워드 를 설정할 수 있습니다. DB 에서 한글이 깨지는 경우가 있을 수 있습니다. 이 경우 connect() 호출 시 charset을 utf8로 지정하면 정상 출력됩니다.

 

Cursor는 Query 문에 의해서 반환되는 결과를 저장하는 메모리 공간으로, Client에서 명시적으로 선언해서 사용하는 것은 Explicit Cursor라고 합니다. (DBMS 내부에서 선언하는 Implicit Cursor도 있습니다.)  Cursor는 주로 여러 개의 행을 처리하는 경우에 사용합니다. cursor.execute() 명령어에서 SQL SQuery문을 해석하여 DB Server에서 실행됩니다.

 

Fetch는 Cursor의 결과를 서버에서 Client로 가져오는 것을 의미합니다.  fetchall()은 모든 결과를 가져오는 것이고, fetch(size)는 size만큼의 일부 결과만 가져오는 것입니다. 

 

Commit은 DB Query의 모든 작업이 정상실행되고 이를 확정해서 DB서버에 반영하는 명령어입니다. 즉, DB 트랜젝션의 처리 과정을 DB에 영구적으로 반영하여 저장하게 됩니다. Commit을 수행하면 하나의 트랜젝션을 종료하게 됩니다. Commit을 수행하면 DB rollback은 불가능하게 되기 때문에 실행 시 주의를 해야 합니다.  DB connection connection 생성 시 Auto commit 옵션을 줄 수 있습니다. Auto commit 옵션은 SQL Query 실행 후 자동으로 commit 하는 옵션입니다. 

 

 

# Instantiate Connection

conn = mariadb.connect()

 

# Instantiate Cursor
cur = conn.cursor()

 

# sql query 
sql_squery = "SELECT * FROM your_table "

 

# exec sql query 
cur.execute(sql_squery)

 

# fetch qeury result
rows = cur.fetchall()

 

# commit 
conn.commit()

# Clean up
cur.close()
conn.close()

 

#!/usr/bin/env python
# coding: utf-8

import sys
import mariadb

host='YOUR_DB_SERVER_ADDRESS'
# Default 값은 3306  (Port 번호는 변경될 수 있음)
port=int(3306)
user='YOUR_DB_USERNAME'
passwd='YOUR_DB_PASSWORD'
database='YOUR_DB_NAME'
autocommit=False

# Instantiate Connection
try:
   conn = mariadb.connect(user=user, password=passwd, 
       host=host, port=port, database=database, autocommit=autocommit)
except mariadb.Error as e:
   print(f"Error connecting to MariaDB Platform: {e}")
   sys.exit(1)

# Instantiate Cursor
cur = conn.cursor()

# sql query 
sql_squery = "SELECT * FROM csv_import ORDER BY d ASC LIMIT 0, 5 "

# exec sql query 
cur.execute(sql_squery)

# fetch qeury result
rows = cur.fetchall()
print (rows,'\n')

# commit 
conn.commit()

# Clean up
cur.close()
conn.close()

 

Python에서 DB SQL Query를 사용하는 방법은 비교적 쉽습니다. 다만 DB Table구조에 맞는 SQL 구문을 적절하게 구현하는 것은 많은 경험과 노력이 필요하기 때문에, Python에서 바로 SQL 구문을 테스트하는 것보다는 MySQL Workbench 같은 GUI 프로그램을 활용해서 SQL 구문을 확인하고 이를 Python code로 옮기는 것을 추천드립니다. 

 

관련 글:

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - 우분투 20.04에서 MariaDB 설치 및 기본 동작 확인 명령어

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - MariaDB 또는 MySQL에서 지원하는 Built-in 함수 설명 및 예제

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - MariaDB 또는 MySQL에서 사용하는 Data type 정리

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Jupyter Notebook의 업그레이드: Jupyter Lab 설치 및 extension 사용법

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - CSV 파일에서 MariaDB(또는 MySQL)로 데이터 가져오는 방법

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - 우분투 20.04에서 Jupyter Notebook 사용법: Web browser에서 Python 개발 환경 구축

[개발환경/git] - GitHub 아이디/패스워드 입력 없이 사용하는 방법

[SW 개발/REST API] - 자주 사용하는 curl 명령어 옵션과 예제

[개발환경/우분투] - 대용량 파일을 작은 크기로 분할하는 방법: split

[SW 개발/REST API] - 공공 데이터 Open API 사용법: 코로나 확진자 현황 API (sample code)

 




댓글