Python - 파이썬과 DB의 연동
pymysql 설치
파이썬 자체에는 MySQL을 인식하는 기능이 없기 때문에 외부 라이브러리인 pymysql을 설치해야한다. 설치 방법은 명령 프롬프트를 통해 다음 명령어를 실행하면 된다.
pip install pymysql
- 명령프롬프트: 운영체제와 상호작용을 할 수 있는 텍스트 기반 인터페이스
- pip: 파이썬으로 만든 패키지들을 열람하고 관리할 수 있는 저장소인 Python Package Index (PyPI) 로부터 파이썬 패키지를 받아 설치하는 패키지 관리 도구. 파이썬을 설치할 때 함께 설치된다.
설치가 다 되고나면 이후부터는 import pymysql 문을 통해서 파이썬에서 MySQL관련 함수를 사용할 수 있다.
파이썬-DB 연동 절차
데이터 입력 작업 - insert, update, delete
순서:
- MySQL 연결
- 커서 생성
- 데이터 입력
- 입력한 데이터 저장
- MySQL 연결 종료
-
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’ 입력
-
커서 생성
커넥션 객체를 통해 데이터베이스에서 SQL문을 대신 실행해주고 결과를 반환해 줄 커서 객체를 생성한다.
cur = conn.cursor()
- 커서 객체를 생성해야하는 이유는 커서 객체에 DB작업을 위한 함수들이 포함되어 있기 때문
-
데이터 입력
실행할 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 - “이 자리에 실수 하나”
-
포맷문자를 사용했으면 각 자리에 어떤 값이 들어갈지 매칭해주어야 함
-
튜플을 이용해서 포맷문자에 들어갈 변수들을 순서대로 매칭한다.
→ 변수가 하나밖에 없을 경우에도 튜플로 정의를 해주기 위해 반드시 (변수,) 형태로 콤마를 넣어줘야한다.
-
-
-
입력한 데이터 저장
앞서 입력된 데이터는 아직 트랜잭셕 이후 완전히 저장되지 않았기 때문에 커밋을 해줘야한다.
conn.commit()
-
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
순서:
- MySQL 연결
- 커서 생성
- 데이터 조회
- 조회한 데이터 출력
- 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 연결종료
댓글남기기