어제 계획한 방법대로 코드를 짜다 보니 1일 최대 한도(864,000)를 넘을 것 같아서 조금 방법을 바꿨음
1) rank/top
에서 1등부터 1000등까지 userNum
획득
2) 해당 데이터 DB에 저장 → user_info 테이블
3) user_info 테이블에 있는 userNum
정보로 user/games
접근
4) user/games
에서 unique한 gameId
및 startDtm
(서버의 게임 시작 시간), expireDtm
(해당 게임 데이터 호출 만료 기간) 받기
우리가 중점적으로 볼 내용은 시즌 6(seasonId 29) 정보
90일이 지난 게임 데이터는 더 이상 API로 불러올 수 없음
expireDtm
의 경우 유저마다 시간이 다르기 때문에(게임 종료 시간이 팀마다 다름) 그냥 '년-월-일'로 변환시켜서 처리하면 될 듯
https://github.com/jmpop97/ER_statistics/blob/main/read_txt.py
sqlalchemy의 커넥터만 변경해 주면, MySQL뿐만 아니라 모든 데이터베이스에 적용 가능
sqlalchemy
,pymysql
이 설치되어 있어야 함
sqlalchemy
를 통해 DB 연결import pandas as pd
from sqlalchemy import create_engine
engine = create_engine(
'mysql://root:password@localhost/table'
, convert_unicode=True
)
conn = engine.connect()
read_sql()
# 방법 1: read_sql_table()
data = pd.read_sql_table('table_name', conn)
data.head()
# 방법 2: read_sql_query() → 추천
query = "select * from table_name;"
data = pd.read_sql_query(sql=query, con=conn)
1) pymysql
모듈
import pymysql
db = pymysql.connect(
host='', # 접속할 mysql server의 주소
port='3306', # 접속할 mysql server의 포트 번호
user='your_id',
passwd='your_pw',
db='dbname' # 접속할 database명
charset='' # 'utf8' 등 문자 인코딩 설정 (한글 데이터가 깨지지 않도록)
)
2) Mysql 데이터 python으로 받기
cursor
객체 생성cursor = db.cursor()
메서드 | 설명 |
---|---|
fetchall() | 쿼리 결과의 모든 데이터를 가져오기 |
fetchone() | 쿼리 결과의 1개 행만 가져오기 |
fetchmany() | 쿼리 결과의 데이터 n개 가져오기 |
ql = 'SELECT * FROM table_name'
cursor.execute(sql)
result = cursor.fetchall()
3) MySQL 데이터 pandas DataFrame으로 바로 받기
sql = 'SELECT * FROM table_name'
df = pd.read_sql(sql, db)
※ 작업이 끝났으면 DB 연결 닫기
db.close()
데이터 분석의 결과 데이터를 MySQL 테이블로 내보내거나, 테이블을 수정/삭제 하는 등의 작업을 하는 방법 알아보기
1) INSERT/UPDATE/DELETE 쿼리 실행
cursor.execute()
→ db.commit()
메서드로 이루어짐sql = '''
{INSERT/UPDATE/DELETE 쿼리}
'''
cursor.execute(sql)
db.commit()
2) DataFrame → MySQL 내보내기
from sqlalchemy import create_engine
engine = create_engine("mysql+pymysql://[id]:[pw]@[mysql주소]:[port]/[db_name]?charset=utf8", encoding='utf-8')
conn = engine.connect()
df.to_sql(name="[table_name]", con=engine, if_exists='append', index=False)
to_sql()
메서드1) mysql에서 데이터를 불러오기
execute()
→ fetch(one, many, all)
pd.read_sql(sql, db)
2) mysql로 데이터 보내기/수정하기
execute()
→ commit()
df.to_sql("table_name", con=engine)
3) pymysql 사용법
1. pymysql 모듈 import
2. MySQL db 연결: pymysql.connect() 메서드로 Connection 객체 생성
3. Connection 객체로부터 cursor() 메서드로 Cursor 객체 생성
4. Cursor 객체의 execute() 메서드로 sql 쿼리를 mysql db에 전송
5. SELECT 쿼리의 경우 fetchall(), fetchone(), fetchmany() 메서드를 사용하여 데이터를 가져옴
pd.read_sql()
을 사용하면 데이터를 바로 DataFrame으로 불러올 수 있음4) sqlalchemy 사용법
1. sqlalchemy create_engine(sql db 연결 라이브러리)을 import
2. MySQL db 연결: create_engine() 메서드로 engine 객체 생성. connect() 메서드로 db 연결
3. DataFrame → MySQL 내보내기: df.to_sql() 메서드 사용
4. 종료: close() 메서드로 db 연결 종료
import mysql.connector
# MySQL 데이터베이스에 접속
cnx = mysql.connector.connect(user='사용자명', password='비밀번호',
host='호스트명',
database='데이터베이스명')
# 커서 생성
cursor = cnx.cursor()
# SQL 쿼리 실행
query = "SELECT * FROM 테이블명"
cursor.execute(query)
# 결과 가져오기
result = cursor.fetchall()
# 결과 출력
for row in result:
print(row)
# 연결 종료
cursor.close()
cnx.close()
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# MySQL 데이터베이스에 접속
engine = create_engine('mysql+mysqlconnector://사용자명:비밀번호@호스트명/데이터베이스명')
# 세션 생성
Session = sessionmaker(bind=engine)
session = Session()
# 모델 정의
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(50))
email = Column(String(50))
# 데이터 조회
users = session.query(User).all()
for user in users:
print(user.name, user.email)
# 데이터 추가
new_user = User(name='John Doe', email='johndoe@example.com')
session.add(new_user)
session.commit()
# 연결 종료
session.close()
MySQL Connector/Python과 SQLAlchemy를 사용하여 파이썬에서 MySQL 데이터베이스에 접속하고, 데이터를 읽고 쓰는 작업을 수행할 수 있습니다. 이를 통해 데이터 처리 및 분석 작업을 더욱 효율적으로 수행할 수 있으며, 데이터베이스와의 상호작용을 간편하게 할 수 있습니다.
MySQL 데이터베이스 연동은 파이썬을 활용한 다양한 프로젝트에서 필수적인 요소입니다. 따라서 소개한 방법을 활용하여 파이썬과 MySQL을 연동하는 작업에 익숙해지는 것이 중요합니다. 더불어 다른 데이터베이스와의 연동 방법과 비교하여 장단점을 파악하고, 최적의 방법을 선택하는 것도 중요한 과제입니다.
df_selected = df_selected.rename(
columns={
"name": "city",
"main.temp": "temperature",
"main.humidity": "humidity",
"wind.speed": "wind_speed",
}
)