[Docker&DB] Docker와 PyMySQL
지금까지 Docker image mariadb, DBeaver mariadb를 사용하여 database를 다루는 환경을 세팅하고, 쿼리문을 작성해보았다. RDBMS 마지막 시간에서는 python으로 mysql을 다루는데, 이러한 방법이 있는줄 몰랐고 생소한 내용이어서 기록해두기로 하였다.
환경 세팅
우선 Docker 컨테이너 접속하여 가상환경 전원을 켜준다. 개발 환경은 docker container와 visual studio code를 활용하였다.
사용할 도커 컨테이너를 터미널에서 작동시키고, vsc를 통해 접속하면 된다.
위 화면은 아직 가상환경 접속 전 상태이므로 오른쪽에 로컬에서 사용했던 코드가 보인다
가상환경에 접속하기 위해 원하는 컨테이너에 오른쪽 마우스를 클릭한 뒤, Attach Visual Studio Code를 선택한다.
그럼 위와 같이 가상환경 화면이 뜬다. 여기까지 하면 환경 세팅은 끝!
지금까지 해당 컨테이너에서 진행했던 실습 파일들이 쭉 나오는 걸 확인할 수 있다.
이번 실습에서는 jupyter notebook을 사용할 거라서 ipynb 파일을 생성하였다.
이 파일을 생성하고 국룰 세팅 테스트인 "hello world"를 찍으면 관련 확장 프로그램을 설치하라고 알아서 안내해준다.
안내대로 설치하고 print해보니 잘 나오는 걸 확인할 수 있었다.
Cursor(커서)
커서란?
하나의 DB connection에 대해 독립적으로 SQL문을 실행할 수 있는 작업환경을 제공하는 객체이다.
이 cursor를 통해서 SQL 문을 실행하고, 응용 프로그램이 실행 결과를 튜플 단위로 접근할 수 있도록 한다.
파이썬 프로그램에서 DBMS의 데이터를 조회하면 일단 cursor에 저장되고, 파이썬 프로그램(응용 프로그램에서 이 cursor에 있는 데이터를 추출해서 사용한다.)
이를 사용하기 위해서 아래와 같은 모듈이 필요하다.
- PyMySql: python에서 sql을 사용할 수 있도록 하는 라이브러리
- pandas
실습 1) connect(), cursor(), fetchall(), close()
1. pymysql 설치
pip install mypysql
도커 컨테이너에서 가상환경을 실행한 경로를 찾아간 뒤, 명령어를 통해 mypysql을 설치한다
2. database와 python 연동하기
w9라는 컨테이너에서 파이썬&pymysql 실행, mariadb 사용을 하는 상황이므로 아래와 같이 pymysql을 import하고 connect 함수를 통해 세팅을 해준다
import pymysql
# db 연결
mydb = pymysql.connect(
host= '172.17.0.1',
port= 3306, # mariadb 연결 port
user= 'root',
passwd= 'qwer', # mariadb에서 내가 설정한 password
db= 'nation', # mariadb의 sample data "nation" 사용
charset= 'utf8'
)
3. 커서 설정하기
cursor=mydb.cursor()
sql 쿼리문 작성을 위해 mydb의 cursor 객체를 생성해준다.
4. excute()와 fetchall()을 통해 쿼리문 실행
cursor()를 통해 튜플로 값을 잘 반환해주는 걸 확인할 수 있다.
res라는 변수에 fetchall 값을 저장했으므로, cursor와 db 연결을 종료하더라도 res 변수를 통해 데이터를 활용할 수 있다.
실습 2) with 문 사용
with문을 사용하면 수동으로 close()를 하는 번거로움을 없앨 수 있다.
sql = "SELECT * FROM countries"
try:
with pymysql.connect(
host= '172.17.0.1',
port= 3306,
user= 'root',
passwd= 'qwer',
db= 'nation',
charset= 'utf8'
) as db :
cursor = db.cursor()
cursor.execute(sql)
rows_1 = cursor.fetchall()
except pymysql.err.OperationalError as e :
print(e)