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.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를 조작할 수 있다는 것이 신기하였다.
아직 구조만 파악해서 사용할 때 어떻게 사용할지는 못하지만 계속 반복하여 풀어야할 것 같다!
'AI 공부 > 파이썬' 카테고리의 다른 글
파이썬 (Numpy) (0) | 2022.08.24 |
---|---|
파이썬 (SQLAIchemy) (0) | 2022.08.23 |
파이썬 (pip와 가상 환경) 마지막! (0) | 2022.08.10 |
파이썬 (파일(JSON) 입출력, 구글 드라이브 마운트, YAML, pickle 모듈) (0) | 2022.08.10 |
파이썬 (정규 표현식, 메타문자) (0) | 2022.08.09 |
댓글