본문 바로가기

Python/Basic

[파이썬] 원격 database(MariaDB)와 연동

MariaDB는 오픈 소스 관계형 데이터베이스 관리 시스템(RDBMS)으로, Python에서 이를 활용하여 데이터베이스 작업을 수행할 수 있습니다. 이번 포스팅에서는 Python에서 MariaDB와 연동하고, 데이터베이스 작업을 수행하는 예제 코드를 다뤄보겠습니다.

 

1. 라이브러리 설치

먼저, Python에서 MariaDB를 활용하기 위해 MySQLdb 라이브러리를 설치합니다. 

아래 명령을 사용하여 설치할 수 있습니다.

pip install mysqlclient

 

2.데이터베이스 연결설정

import MySQLdb

config = {
    'host':'127.0.0.1',
    'user':'사용자',
    'password':'패스워드',
    'database':'사용하는 데이터베이스명',
    'port':3306,
    'charset':'utf8',
    'use_unicode':True
}

# 데이터베이스에 연결
conn = MySQLdb.connect(**config)  # **config를 사용하여 딕셔너리 풀기
cursor = conn.cursor()  # 커서 생성. SQL문 실행 및 select 결과를 기억하는 클래스

 

3.데이터 추가, 수정, 삭제 및 읽기

# 데이터 추가 예제
sql = "insert into 테이블명 values(%s,%s,%s,%s)"
sql_data = (6,'신상1',5,'5000')
cursor.execute(sql, sql_data) # SQL문 실행
conn.commit()

# 데이터 수정 예제
sql = "update 테이블명 set 칼럼1=%s,칼럼2=%s,칼럼3=%s where 조건"
sql_data=('python',12,50000,6)
result=cursor.execute(sql,sql_data)
conn.commit() #변경사항을 데이터베이스에 저장합니다.

# 데이터 삭제 예제
code = '6'
sql="delete from 테이블명 where 조건"
count=cursor.execute(sql,code)
conn.commit()

# 데이터 읽기 예제
sql="select 원하는 칼럼 from 테이블명"
cursor.execute(sql)

# 출력1
for data in cursor.fetchall():
    print('%s %s %s %s' % data)

#sql 변수에는 데이터를 조회하는 SQL 쿼리문이 저장됩니다.
#cursor.execute()를 사용하여 SQL 쿼리문을 실행합니다.
#cursor.fetchall()을 사용하여 모든 데이터를 가져옵니다.

# 출력2
for r in cursor:
    print(r[0], r[1], r[2], r[3])
# cursor를 이용하여 데이터를 읽습니다. 각 열은 인덱스로 접근 가능합니다.

# 출력3
for (변수들-출력을 원하는 칼럼 수에 맞게 설정하기) in cursor:
    print(칼럼들)
#튜플 언패킹을 이용하여 데이터를 읽습니다.

 

4.데이터베이스 연결 종료

# 데이터베이스 연결 종료
finally:
    cursor.close()  # 커서 닫기
    conn.close()  # 연결 종료

 

 

 

 

DB연결 예시 코드) 원하는 직원에 대한 정보 출력하기

 

import pickle  # pickle 모듈을 import하여 객체 직렬화/역직렬화 가능

# 'mydb.dat' 파일을 이용하여 데이터베이스 연결 설정 정보를 불러오기
with open(r'mydb.dat', mode='rb') as obj:
    config = pickle.load(obj)

def chulbal():
    try:
        # MySQL 데이터베이스에 연결
        conn = MySQLdb.connect(**config)
        cursor = conn.cursor()  # 커서 생성. SQL문 실행 및 select 결과를 기억하는 클래스

        jikwon_no = input('직원번호 입력: ')
        jikwon_name = input('직원이름 입력: ')

        # 직원 정보를 조회하는 SQL 쿼리문
        jikwon = """
        select jikwon_no, jikwon_name, buser_name, jikwon_pay, jikwon_jik, jikwon_gen
        from jikwon j join buser b on b.buser_no=j.buser_num
        where jikwon_no={} and jikwon_name='{}'
        """.format(jikwon_no, jikwon_name)

        cursor.execute(jikwon)  # SQL문 실행
        datas = cursor.fetchall()  # 결과 가져오기

        if len(datas) == 0:
            print('그런 직원은 없습니다.')
            return

        buser_name = datas[0][2]  # 부서명 가져오기

        # 부서별 직원 정보를 조회하는 SQL 쿼리문
        sql2 = """
        select jikwon_no, jikwon_name, buser_name, jikwon_pay, jikwon_jik, jikwon_gen
        from jikwon j join buser b on b.buser_no=j.buser_num
        where b.buser_name='{}' order by j.jikwon_jik, j.jikwon_name asc
        """.format(buser_name)

        cursor.execute(sql2)  # SQL문 실행
        result = cursor.fetchall()  # 결과 가져오기

        for jikwon_no, jikwon_name, buser_name, jikwon_pay, jikwon_jik, jikwon_gen in result:
            print(jikwon_no, jikwon_name, buser_name, jikwon_pay, jikwon_jik, jikwon_gen)

        print('인원수: ' + str(len(result)))

        jikwon_no = datas[0][0]  # 검색된 직원 번호 가져오기

        # 직원이 관리하는 고객 정보를 조회하는 SQL 쿼리문
        sql3="""
        select gogek_no, gogek_name, gogek_tel, YEAR(CURDATE()) 
        - YEAR(STR_TO_DATE(SUBSTRING(gogek_jumin,1,6), '%y%m%d')) 
        - (RIGHT(CURDATE(),5) < RIGHT(STR_TO_DATE(SUBSTRING(gogek_jumin,1,6), '%y%m%d'),5)) AS age 
        from gogek g join jikwon j on j.jikwon_no=g.gogek_damsano
        where g.gogek_damsano='{}'
        """.format(jikwon_no)

        cursor.execute(sql3)  # SQL문 실행
        result2 = cursor.fetchall()  # 결과 가져오기

        for gogek_no , gogek_name ,gogek_tel, age in result2:
            print(gogek_no , gogek_name ,gogek_tel, age)

        print('관리 고객수: ' + str(len(result2)))

    except Exception as e:
        print('err:', e)
    finally:
        cursor.close()  # 커서 닫기
        conn.close()  # 연결 종료

if __name__ == '__main__':
    chulbal()

 

 

 

각 코드별로 주석을 달아놨기에 참고해주세요~