[Flask] PyMySQL을 이용해서 MySQL 사용하기

hukim·2020년 11월 22일
0

Flask

목록 보기
2/5
post-thumbnail

Python에서 PyMySQL을 사용해서 DB내 데이터를 조작하는 방법에 대해 알아보았습니다.

PyMySQL 패키지 설치하기

pip install PyMySQL
import pymysql

터미널을 이용해서 라이브러리를 설치하고
사용할때는 import 해서 사용하면 됩니다.

DB 연결하기 DB Connection

import pymysql

db_connection = pymysql.connect(
	user    = 'root',
        passwd  = 'your_password',
    	host    = '127.0.0.1',
    	db      = 'myflask',
    	charset = 'utf8'
)

connect() 메소드를 이용해서 DB와 연결해줍니다.

  • user : user name
  • passwd : 패스워드
  • host : DB가 있는 host
  • db : 연결할 DB이름
  • charset : 인코딩 설정

PyMySQL 공식문서에 들어가면 connection 옵션에 대해 보다 자세하게 설명되어있고 위에서 쓰인 옵션보다 많은 옵션들을 활용할 수 있습니다.

cursor()

cursor = db.cursor(pymysql.cursors.DictCursor)

DB와 상호작용을 하기 위한 cursor객체를 생성해줍니다.
PyMySQL 공식문서에 따르면 cursor의 종류는 Cursor, SSCursor, DictCursor, SSDictCursor등을 이용할 수 있다고 나와있습니다.

저는 Json 형태의 Dictionary로 상호작용을 할 것이기 때문에 Dictionary형태로 결과를 반환해주는 DictCursor를 사용했습니다.

DictCursor가 아닌 일반 Cursor를 사용하면 결과가 튜플 형태로 리턴됩니다.

데이터 조작하기

DB 연결까지 진행했고 이제 DB내의 데이터를 SELECT 해보겠습니다.

SELECT

PyMySQL 에서는 execute()와 fetch()를 이용해서 데이터를 핸들링할 수 있습니다..

db = db_connection()
cursor.execute("""
	SELECT id,
    	       subject,
               contents,
               create_date
        FROM questions
	""")
result = cursor.fetchall()
return result

cursor.execute()을 이용해서 SQL을 실행하고 그 결과는 fetchall()을 이용해서 받아옵니다.

  • fetchall() : 모든 데이터를 한 번에 가져올 때 사용
  • fetchone() : 한 번 호출에 하나의 행만 가져올 때 사용
  • fetchmany(n) : n개만큼의 데이터를 가져올 때 사용

INSERT

db = db_connection()
cursor.execute("""
	INSERT INTO 'question` 
    		    (id, subject, contents)
               VALUES 
                    (1, 'subject', 'contents')
	""")
db.commit()
db.close()

execute()를 이용해 INSERT 쿼리를 실행한 후 commit()을 날려줍니다.
commit()을 하지 않으면 execute()를 아무리 하더라도 그 결과값이 DB에 실제 반영되지 않습니다.

처음 PyMySQL의 커넥션을 만들 때 autocommit=True 파라미터를 사용할 수도 있습니다만 혹시 모르는 상황을 대비해 autocommit 옵션을 True로 하지 않았습니다.
(pymysql의 기본 옵션은 autocommit = False)

UPDATE, DELETE

따로 코드를 작성하지는 않지만 INSERT와 마찬가지로 진행하면 됩니다.

2개의 댓글

comment-user-thumbnail
2021년 3월 3일

안녕하세요! flask 앱을 만들고 로컬에 mysql db 설치후 sqlalchemy, pymysql이용해 연결하여 가상환경에서 flask run을 했을 땐 정상 작동 되는데요, 헤로쿠에 배포한 상태에서는 메인화면, 로그인화면까지만 뜨고 로그인했을 경우 다음 화면으로 넘어가지 않습니다. 무엇이 문제일까요? ㅜㅜ 제 배포 주소는 https://shielded-mesa-50206.herokuapp.com 이고, 에러메시지는 Internal Server Error 입니다. ㅠㅠ 작업중인 깃헙 리포지토리는 https://github.com/figobaek/crudtest.git 입니다. 에러 메시지는 sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on '127.0.0.1' ([Errno 111] Connection refused)") 이렇게 뜹니다. 도와주세요 ㅠㅠㅠ

1개의 답글