Python - 파이썬과 DB의 연동

2 분 소요

pymysql 설치

파이썬 자체에는 MySQL을 인식하는 기능이 없기 때문에 외부 라이브러리인 pymysql을 설치해야한다. 설치 방법은 명령 프롬프트를 통해 다음 명령어를 실행하면 된다.

pip install pymysql
  • 명령프롬프트: 운영체제와 상호작용을 할 수 있는 텍스트 기반 인터페이스
  • pip: 파이썬으로 만든 패키지들을 열람하고 관리할 수 있는 저장소인 Python Package Index (PyPI) 로부터 파이썬 패키지를 받아 설치하는 패키지 관리 도구. 파이썬을 설치할 때 함께 설치된다.

설치가 다 되고나면 이후부터는 import pymysql 문을 통해서 파이썬에서 MySQL관련 함수를 사용할 수 있다.

 

파이썬-DB 연동 절차

데이터 입력 작업 - insert, update, delete

순서:

  1. MySQL 연결
  2. 커서 생성
  3. 데이터 입력
  4. 입력한 데이터 저장
  5. MySQL 연결 종료

  1. MySQL 연결

    DB server에 연결, 정상적으로 연결이 수립되면 커넥션 객체를 반환

    #기본형태
    연결자 = pymysql.connect(연결옵션)
       
    #사용 예
    import pymysql
    conn = pymysql.connect(host='localhost', user='root', password='1234', db='encore', charset='utf8')
    

    연결옵션:

    • host - 서버주소. 자신의 컴퓨터를 서버로 사용한다면 ‘localhost’ 또는 127.0.0.1 을 입력.
    • user - username 입력
    • password - 서버 암호 입력
    • db - 데이터베이스, 스키마 이름 입력
    • charset - 문자세트 입력. 한글 사용을 위해 ‘utf8’ 입력
  2. 커서 생성

    커넥션 객체를 통해 데이터베이스에서 SQL문을 대신 실행해주고 결과를 반환해 줄 커서 객체를 생성한다.

    cur = conn.cursor()
    
    • 커서 객체를 생성해야하는 이유는 커서 객체에 DB작업을 위한 함수들이 포함되어 있기 때문
  3. 데이터 입력

    실행할 SQL문을 정의하고, 커서 객체를 사용하여 insert, update, delete 작업을 수행한다 (CREATE 테이블 생성도 가능)

    #기본형태
    cur.execute("SQL실행문")
       
    #사용 예
    sql = 'insert into departments values(280, "depth test", null, 1700)'
    cur.execute(sql)
    

    포맷문자를 사용하여 SQL문의 변수값이 들어갈 자리를 미리 잡아놓을 수도 있다.

    sql = "insert into members values(%s, %s, %s, %s)"
    vals = (id, pwd, name, email)
    cur.execute(sql, vals)
    
    • 포맷문자

      name = 'aaa'  #문자열
      age = 12  #정수
      height = 173.89  #실수
      vals = (name, age, height)  #values(%s, %d, %f) 
      
      • %s - “이 자리에 문자열 하나”

      • %d - “이 자리에 정수 하나”

      • %f - “이 자리에 실수 하나”

      • 포맷문자를 사용했으면 각 자리에 어떤 값이 들어갈지 매칭해주어야 함

      • 튜플을 이용해서 포맷문자에 들어갈 변수들을 순서대로 매칭한다.

        → 변수가 하나밖에 없을 경우에도 튜플로 정의를 해주기 위해 반드시 (변수,) 형태로 콤마를 넣어줘야한다.

  4. 입력한 데이터 저장

    앞서 입력된 데이터는 아직 트랜잭셕 이후 완전히 저장되지 않았기 때문에 커밋을 해줘야한다.

    conn.commit()
    
  5. MySQL 연결 종료

    DB 사용이 끝났다면 연결을 끊어준다

    conn.close()
    
    • 코드 작성 시 연결 종료문이 반드시 마지막에 올 필요는 없다. DB에서 가져온 데이터는 아직 사용하더라도 DB의 연결이 더이상 필요하지 않다면 접속을 먼저 끊어도 좋다.

결과적으로 다음과 같은 코드 작성이 가능하다:

def insert(self, vo):
    self.conn = pymysql.connect(host='localhost', user='root', password='1234', db='encore', charset='utf8')
    cur = self.conn.cursor()  
    sql = "insert into members values(%s, %s, %s, %s)"
    vals = (vo.id, vo.pwd, vo.name, vo.email)
    cur.execute(sql, vals)
    self.conn.commit()
    self.conn.close()

 

데이터 읽기 작업 - select

순서:

  1. MySQL 연결
  2. 커서 생성
  3. 데이터 조회
  4. 조회한 데이터 출력
  5. MySQL 연결종료

1 ~ 2. 데이터 입력 과정과 동일

import pymysql
conn = pymysql.connect(host='localhost', user='root', password='1234', db='encore', charset='utf8')
cur = conn.cursor()

3. 데이터 조회

커서에 SELECT로 조회한 결과를 한꺼번에 저장

sql = 'select * from departments where department_id=%d'
vals = (department_id,)
cur.execute(sql, vals)

4. 조회결과를 커서에서 fetch

조회한 데이터를 커서객체에서 한 행씩 접근하여 출력

#여러 줄 출력
for row in cur:
		print(row[0], row[1], row[2], row[3])

#한 줄 출력
row = cur.fetchone()
if row == None:
    print('검색결과없음')
else:
    print(row[0], row[1], row[2], row[3])
  • 여러줄 검색
    • for row in cursor: cursor에서 검색된 한 줄씩 꺼내서 row에 담음
    • row[0], row[1], row[2]: 한 줄에서 각 컬럼 추출
  • 한줄 검색
    • row = cursor.fetchone(): cursor에서 검색된 한 줄 추출
    • row[0], row[1], row[2]: 한 줄에서 각 컬럼 추출

5. MySQL 연결종료

댓글남기기