본문 바로가기
AI 공부/파이썬

파이썬 (Pymysql)

by AI Sonny 2022. 8. 23.
728x90

Pymysql은 내 DB를 파이썬에 연결하여 사용하는 것이다.

 

설치는 다음과 같이 한다.

!pip install pymysql

 

구글 드라이브를 연결하고, 기존에 내 db.yaml파일을 읽는 형식으로 가져온다.

 

- DB 접속정보

 

db_info
=> 나의 Host와 user와 passwd,port 정보가 나온다.

 

이 후 다음과 같이 연동한다.

 

HOST = db_info["HOST"]
USER = db_info["USER"]
PASSWD = db_info["PASSWD"]
PORT = 3306

 

 

- connect 함수를 이용하여 연결객체 받아오기

 

import pymysql
conn = pymysql.connect(
    user = USER,
    passwd = PASSWD,
    host = HOST,
    port = PORT,
    db = 'playdata'
)
conn

 

위와 같이 connect 함수를 이용하여 연결된 객체를 받아온다.

 

- Cursor 객체

  • sql 구문을 실행하기 위한 객체
cursor = conn.cursor()
cursor

 

- execute 메소드를 이용하여 서버에 sql전송하기

 

sql = "select * from titanic_raw;"
cursor.execute(sql)
result = cursor.fetchall() # 쿼리에 실행결과를 다 가져오는 메소드 (한번 실행하면 사라진다.)
result[:2]

=>	((1,
	  0,
	  3,
	  'Braund, Mr. Owen Harris',
	  'male',
	  22.0,
	  1,
	  0,
	  'A/5 21171',
	  7.25,
	  None,
	  'S'),
	 (2,
	  1,
	  1,
	  'Cumings, Mrs. John Bradley (Florence Briggs Thayer)',
	  'female',
	  38.0,
	  1,
	  0,
	  'PC 17599',
	  71.2833,
	  'C85',
	  'C'))

 

 

- dict 형식으로 쿼리 실행결과 받아오기

cursor = conn.cursor(pymysql.cursors.DictCursor)
sql = "select * from titanic_raw;"
cursor.execute(sql)
result = cursor.fetchall() # 쿼리에 실행결과를 다 가져오는 메소드 (한번 실행하면 사라진다.)
result[:2]

cursor = conn.cursor(pymysql.cursors.DictCursor)을 이용하여 dict형태로 쿼리를 변환하였다.

 

for문을 사용하여 데이터를 하나씩 추출할 수도 있다.

 

cursor.execute(sql)
for row in cursor.fetchall():
    print(row)
=>	{'passengerid': 1, 'survived': 0, 'pclass': 3, 'name': 'Braund, Mr. Owen Harris', 'gender': 'male', 'age': 22.0, 'sibsp': 1, 'parch': 0, 'ticket': 'A/5 21171', 'fare': 7.25, 'cabin': None, 'embarked': 'S'}
	{'passengerid': 2, 'survived': 1, 'pclass': 1, 'name': 'Cumings, Mrs. John Bradley (Florence Briggs Thayer)', 'gender': 'female', 'age': 38.0, 'sibsp': 1, 'parch': 0, 'ticket': 'PC 17599', 'fare': 71.2833, 'cabin': 'C85', 'embarked': 'C'}
	{'passengerid': 3, 'survived': 1, 'pclass': 3, 'name': 'Heikkinen, Miss. Laina', 'gender': 'female', 'age': 26.0, 'sibsp': 0, 'parch': 0, 'ticket': 'STON/O2. 3101282', 'fare': 7.925, 'cabin': None, 'embarked': 'S'}
	....

 

- 한행씩 가져오기

 

sql = "select * from titanic_raw;"
cursor.execute(sql)
cursor.fetchone()

=>	{'passengerid': 1,
 	 'survived': 0,
 	 'pclass': 3,
	 'name': 'Braund, Mr. Owen Harris',
	 'gender': 'male',
	 'age': 22.0,
	 'sibsp': 1,
	 'parch': 0,
	 'ticket': 'A/5 21171',
	 'fare': 7.25,
	 'cabin': None,
	 'embarked': 'S'}

 

 

- with 문과 함께 사용하기

  • 더 깔끔한 코드이다.
with conn.cursor() as cursor: # cursor = conn.cursor()
    sql = "select * from titanic_raw;"
    cursor.execute(sql) # 커서가 닫혀있기 때문에 에러발생

 

- 커서 닫아주기
 
항상 cursor를 쓰면 닫아주는 습관을 갖는 것이 좋다.
cursor.closes()

 

- DB 선택없이 접속

 

conn = pymysql.connect(
    user = USER,
    host = HOST,
    passwd = PASSWD,
    port = PORT,
    # autocommit= True # 안좋은 습관
)
conn

 

위 코드는 오토 커밋이 디폴트값인 False로 되어있다.

 

오토 커밋을 원하면 True변경하면 되나 이것은 안좋은 습관이다.

 

- DB 선택하기

conn.select_db("user11") # use DB명; DB 접속!

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

!pip install git+https://github.com/DoItSon/api_project.git

KEY_FILE = "/content/drive/MyDrive/data/local.yml"
with open(KEY_FILE,'r') as f:
    naver_keys = yaml.load(f,Loader = yaml.Loader)

 

나의 DB를 연결해주고 내 git의 HTTP와 연동하여 설치를 한다.

 

그리고 나의 키파일이 있는 경로를 찾아 연동시키면 된다!

 

적용 예시

from my_api import naver_api
url = "https://openapi.naver.com/v1/search/movie.json"
params = {
    "query" : "전우치",
}
result = naver_api.search_api(url,naver_keys["CLIENT_ID"],naver_keys["CLIENT_SECRET"],params)
result

=>{'lastBuildDate': 'Tue, 23 Aug 2022 12:31:17 +0900',
 'total': 5,
 'start': 1,
 'display': 5,
 'items': [{'title': '안녕, <b>전우치</b> 스페셜',
   'link': 'https://movie.naver.com/movie/bi/mi/basic.nhn?code=158852',
   'image': 'https://ssl.pstatic.net/imgmovie/mdi/mit110/1588/158852_P01_130121.jpg',
   'subtitle': '',
   'pubDate': '2016',
   'director': '김대창|',
   'actor': '김율|김새해|정선혜|',
   'userRating': '10.00'},
  {'title': '안녕, <b>전우치</b>! 도술로봇대결전',
   'link': 'https://movie.naver.com/movie/bi/mi/basic.nhn?code=141421',
   'image': 'https://ssl.pstatic.net/imgmovie/mdi/mit110/1414/141421_P23_142816.jpg',
   'subtitle': 'Hello, Jeonwoochi! The Robot Armageddon',
   'pubDate': '2015',
   'director': '김대창|',
   'actor': '김율|김새해|정선혜|홍범기|안장혁|류점희|',
   'userRating': '7.49'},
  {'title': '<b>전우치</b>',
   'link': 'https://movie.naver.com/movie/bi/mi/basic.nhn?code=86279',
   'image': 'https://ssl.pstatic.net/imgmovie/mdi/mit110/0862/86279_P00_111154.jpg',
   'subtitle': '',
   'pubDate': '2012',
   'director': '강일수|',
   'actor': '차태현|유이|이희준|백진희|김갑수|성동일|',
   'userRating': '7.16'},
  {'title': '아저씨는 <b>전우치</b>와 악마를 보았다',
   'link': 'https://movie.naver.com/movie/bi/mi/basic.nhn?code=88964',
   'image': 'https://ssl.pstatic.net/imgmovie/mdi/mit110/0889/88964_P01_194937.jpg',
   'subtitle': '',
   'pubDate': '2010',
   'director': '김탁훈|',
   'actor': '',
   'userRating': '9.35'},
  {'title': '<b>전우치</b>',
   'link': 'https://movie.naver.com/movie/bi/mi/basic.nhn?code=48227',
   'image': 'https://ssl.pstatic.net/imgmovie/mdi/mit110/0482/48227_P46_095817.jpg',
   'subtitle': 'Jeon Woochi : The Taoist Wizard',
   'pubDate': '2009',
   'director': '최동훈|',
   'actor': '강동원|김윤석|임수정|유해진|',
   'userRating': '8.21'}]}

 

- 테이블 만들기

 

sql = """
    create table if not exists tb_movie_info(
        id int unsigned not null auto_increment,
        actor varchar(255),
        director varchar(100),
        pubDate int,
        subtitle varchar(100),
        title varchar(100) not null,
        userRating float,
        primary key(id)
    );
"""
cursor.execute(sql)

 

다음처럼 각 컬럼별 특징을 집어넣어 테이블을 만들 수 있다.

 

movie_list = [
( "명량", 2014),
( "인터스텔라", 2014),
( "해적: 바다로 간 산적",  2014),
( "수상한 그녀",2014),
( "국제시장",2014),
( "트랜스포머: 사라진 시대",2014),
( "군도: 민란의 시대",2014),
( "엣지 오브 투모로우",2014),
( "엑스맨: 데이즈 오브 퓨처 패스트",2014),
( "어메이징 스파이더맨 2",2014),
( "타짜-신의 손",2014),
( "혹성탈출: 반격의 서막",2014),
( "캡틴 아메리카: 윈터 솔져",2014),
( "역린",2014),
( "신의 한 수",2014),
]

 

데이터는 위 와 같다.

 

conn.commit() # 최종적으로 저장
sql= "select * from tb_movie_info;"
cursor.execute(sql)
cursor.fetchall()

=> [{'id': 1,
  'actor': '최민식|류승룡|조진웅|',
  'director': '김한민|',
  'pubDate': 2014,
  'subtitle': 'ROARING CURRENTS',
  'title': '<b>명량</b>',
  'userRating': 8.44},
  ....

 

커밋 후 실행해보면 잘 조회된다!

 

- insert 한번에 실행해서 속도 개선

 

values_list = []
for title,year in movie_list:
    params = {"query" : title, "display" : 1,
              "yearfrom" : year, "yearto" : year}
    result = naver_api.search_api(url,
                                  naver_keys["CLIENT_ID"],
                                  naver_keys["CLIENT_SECRET"],
                                  params
                                  )
sql = '''
    insert into tb_movie_info(actor,director,pubDate,subtitle,title,userRating)
    values(%s, %s, %s, %s, %s, %s);
'''
cursor.executemany(sql,values_list)

 

위와 같이 for 문으로 title과 year의 정보를 담아내고 나의 api의 값을 주고, 마지막 sql문처럼 출력하면 훨씬 빠르다!

 


오늘은 pymysql에 대해 배웠는데 워크벤치에 안들어가고도 파이썬 내에서 DB를 조작할 수 있다는 것이 신기하였다.

 

아직 구조만 파악해서 사용할 때 어떻게 사용할지는 못하지만 계속 반복하여 풀어야할 것 같다! 

728x90

댓글