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()
각 코드별로 주석을 달아놨기에 참고해주세요~