관리 메뉴

개발이야기

[ Python Skill ] Python MySQLdb 사용하여 여러 query 한 번에 실행하기 본문

Python /Python Skill

[ Python Skill ] Python MySQLdb 사용하여 여러 query 한 번에 실행하기

안성주지몬 2019. 6. 7. 00:00

이번 포스팅에서는 MySQLdb 라이브러리를 사용하여 여러 query를 한번에 실행하는것에 대해서 알아보도록 하겠습니다.

 

먼저 Python 에서 MySQL과 연결할때 가장 많이 사용되는 대표적이 두 개의 라이브러리는 PyMySQL과 MySQLdb가 있습니다.

이 중 저는 MySQL에서 제공하는 라이브러리인 MySQLdb를 사용하여 MySQL 연결합니다.

 

1. 데이터베이스 연결하기

import MySQLdb
db = MySQLdb.connect(host=db_info['host'], port=db_info['port'],
	user=db_info['user'], passwd=db_info['passwd'], db=db_info['db'])
    
db.autocommit(True)			

MySQLdb의 connect 함수를 사용하여 원하는 host에 db와 연결합니다.

마지막 줄의 autocommit을 True를 해주면 query들이 execute되면 자동으로 MySQL에 commit 됩니다.

 

2. 여러 쿼리 실행하기

여러분들이 쿼리들이 담겨있는 파일을 읽어 3만개의 쿼리를 2000개씩 나눠 실행한다고 가정합니다.

query_set = ''
cnt = 1
with open('queries.txt', 'r') as f:
	query = f.readline()  # "UPDATE sample_table SET colum1=1 WHERE name='devlop';"
    if not q:
    	if query:
        	cursor = db.cursor()
        	cursor.execute(query_set)
        	cursor.close()
    	break
    query_set += query 
    cnt += 1
    if cnt == 2000:
    	cursor = db.cursor()
        cursor.execute(query_set)
        cursor.close()
        cnt = 1
        query_set = ''

실행시키고자 하는 쿼리는 주석에 달린 쿼리포맷입니다. 뒤에 세미콜론(;)으로 쿼리들을 구분합니다. 

query_set 변수에 위와 같은 포맷의 query들을 합쳐 2000개가 되었을때 퀴리를 실행(execute)해줍니다. 

쿼리를 실행시키기 위해선 cursor를 이용해야 합니다. 위와 같이 cursor 를 사용하여 실행을 시켜주면 db를 연결할때 autocommit을 True로 설정해줬기 때문에 실행된 커리들이 MySQLdb 에 commit되게 됩니다. 

이후 주의할 점이 반드시 cursor을 닫아줘야한다는 것입니다. 그렇지  않으면 sync 관련 에러가 발생합니다.

이 과정을 파일을 다 읽을때까지 반복해주면 여러 쿼리들을 한번에 처리할 수 있습니다.

 

참고

[1] https://mysqlclient.readthedocs.io/user_guide.html

 

MySQLdb User’s Guide — MySQLdb 1.2.4b4 documentation

Docs » MySQLdb User’s Guide Edit on GitHub MySQLdb is an thread-compatible interface to the popular MySQL database server that provides the Python database API. The README file has complete installation instructions. If you want to write applications which

mysqlclient.readthedocs.io

[2] https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-execute.html

Comments