Python으로 MySQL 접속 후 사용하는 방법이다.
Python에서 MySQL을 사용하기 위해서는 먼저 MySQL Driver를 설치
ds_study 활성화한 후, MySQL Driver 설치
pip install mysql-connector-python
MySQL Driver 설치 확인
import mysql.connector
MySQL 연결 생성
mydb = mysql.connector.connect( host = "<hostname>", user = "<username>", password = "<password>" )
import mysql.connector
local = mysql.connector.connect(
host = "localhost",
user = "root",
password = "qwe123!@#"
)
remote = mysql.connector.connect(
host = "database-1.cr8sy4u8g6l2.us-east-2.rds.amazonaws.com",
port = 3306,
user = "admin",
password = "zerobase"
)
MySQL 접속 종료
# import mysql.connector # local = mysql.connector.connect( # host = "<hostname>", # user = "<username>", # password = "<password>", # database = "<databasename>" # ) local.close() # local database 연결 종료 remote.close() # remote database 연결 종료
local.close()
remote.close()
특정 Database 연결
import mysql.connector mydb = mysql.connector.connect( host = "<hostname>", port = "<port>", user = "<username>", password = "<password>", database = "<databasename>" )
local = mysql.connector.connect(
host = "localhost",
user = "root",
password = "qwe123!@#",
database = "zerobase"
)
local.close()
# 바로 Local MySQL 연결을 종료하는 이유는 종료하지 않으면 연결이 많아지기 때문
remote = mysql.connector.connect(
host = "database-1.cr8sy4u8g6l2.us-east-2.rds.amazonaws.com",
port = "3306",
user = "admin",
password = "zerobase",
database = "zerobase"
)
remote.close()
SQL query 실행
import mysql.connector mydb = mysql.connector.connect( host = "<hostname>", user = "<username>", password = "<password>", database = "<databasename>" ) mycursor = mydb.cursor() # MySQL 데이터베이스와 상호 작용하기 위한 커서 객체 생성 mycursor.execute(<query>) # 지정된 SQL 쿼리 실행
remote = mysql.connector.connect(
host = "database-1.cr8sy4u8g6l2.us-east-2.rds.amazonaws.com",
port = "3306",
user = "admin",
password = "zerobase",
database = "zerobase"
)
cur = remote.cursor()
cur.execute("create table sql_file (id int, filename varchar(16))")
remote.close()
mysql -h database-1.cr8sy4u8g6l2.us-east-2.rds.amazonaws.com -P 3306 -u admin -p
use zerobase;
show tables;
desc sql_file;
remote = mysql.connector.conenct(
host = "database-1.cr8sy4u8g6l2.us-east-2.rds.amazonaws.com",
port = "3306",
user = "admin",
password = "zerobase",
database = "zerobase"
)
cur = remote.cursor()
cur.execute("drop table sql_file")
remote.close()
desc sql_file;
show tables;
SQL File 실행
mydb = mysql.connector.connect( host = "<hostname>", user = "<usernmae>", password = "<password>", database = "<databasename>" ) mycursor = mydb.cursor() sql = open("<filename>.sql").read() mycursor.execute(sql)
create table sql_file
(
id int,
filename varchar(16)
);
remote = mysql.connector.connect(
host = "database-1.cr8sy4u8g6l2.us-east-2.rds.amazonaws.com",
port = "3306",
user = "admin",
password = "zerobase",
database = "zerobase"
)
cur = remote.cursor()
sql = open("test03.sql").read()
cur.execute(sql)
remote.close()
show tables;
desc sql_file;
SQL File 내 여러가지 query가 존재할 경우
mydb = mysql.connector.connect( host = "<hostname>", user = "<username>", password = "<password>", database = "<databasename>" ) mycursor = mydb.cursor() sql = open("<filename>.sql").read() result = mycursor.execute(sql, multi=True)
insert into sql_file values (1, "test01.sql");
insert into sql_file values (2, "test02.sql");
insert into sql_file values (3, "test03.sql");
insert into sql_file values (4, "test04.sql");
remote = mysql.connector.connect(
host = "database-1.cr8sy4u8g6l2.us-east-2.rds.amazonaws.com",
port = "3306",
user = "admin",
password = "zerobase",
database = "zerobase"
)
cur = remote.cursor()
sql = open("test04.sql").read()
cur.execute(sql)
remote.close()
#결과: 에러(InterfaceError)
# multi=True 사용 시
remote = mysql.connector.connect(
host = "database-1.cr8sy4u8g6l2.us-east-2.rds.amazonaws.com",
port = "3306",
user = "admin",
password = "zerobase",
database = "zerobase"
)
cur = remote.cursor()
sql = open("test04.sql").read()
for result_iterator in cur.execute(sql, multi=True):
if result_iterator.with_rows: # 현재 실행된 쿼리가 결과를 반환하는지 확인
print(result_iterator.fetchall()) # 현재 실행된 쿼리의 모든 결과 행 출력
else:
print(result_iterator.statement) # 현재 실행된 쿼리 출력
remote.commit() # 데이터베이스에 대한 모든 변경 사항을 영구적으로 저장
remote.close()
show tables;
desc sql_file;
select * from sql_file;
Fetch All
mycursor.excute(<query>) result = mycursor.fetchall() # fetchall() 메서드를 사용하여 실행된 쿼리의 모든 결과 가져오기 for data in result: # 결과 리스트를 순회하면서 각 행(row)을 data 변수에 대입 print(data) # 각 행의 데이터 출력
buffered=True
Query를 실행한 다음에 결과 값이 혹시 row를 포함하고 있으면 fetch를 해서 print
remote = mysql.connector.connect(
host = "database-1.cr8sy4u8g6l2.us-east-2.rds.amazonaws.com"
port = 3306,
user = "admin",
password = "zerobase",
database = "zerobase"
)
cur = remote.cursor(buffered=True)
cur.execute("select * from sql_file")
result = cur.fetchall()
for result_iterator in result:
print(result_iterator)
remote.close()
cursor를 통해서 query를 실행한 다음에 가져오는 결과값이 데이터인 경우에 사이즈가 크다. 기본 cursor를 생성했을때 실행이 안될 수 있기에 읽어올 데이터 양이 많은 경우 buffered 옵션을 Ture로 줘야한다 (buffered=True
).
참고: 검색결과를 Pandas로 읽기
import pandas as pd df = pd.DataFrame(result) df.head()
CSV에 있는 데이터를 Python 코드로 테이블에 추가(insert)
police_station.csv를 pandas로 읽어와서 데이터를 확인
import pandas as pd
df = pd.read_csv("police_station.csv")
df.head()
# df: dataframe
import mysql.connector
conn = mysql.connector.connect(
host = "database-1.cr8sy4u8g6l2.us-east-2.rds.amazonaws.com",
port = 3306,
user = "zero", # 실습때 만들어 두었던 zero 사용자 사용
password = "1234",
database = "zerobase"
)
읽어올 양이 많은 경우, cursor 생성 시 buffer 설정
을 해준다.
cursor = conn.cursor(buffered=True)
select 해줄게 아니여서 buffer 설정 비활성화 해도 됨
sql = "INSERT INTO police_station VALUES (%s, %s)"
# police_station 테이블에 두가지의 string 값 넣기
# %s에서 s는 string을 뜻함
for i, row in df.iterrows(): # DataFrame의 각 행에 대해 반복
cursor.execute(sql, tuple(row)) # SQL 쿼리 실행 (sql은 실행할 쿼리, tuple(row)는 현재 행의 데이터를 튜플 형태로 전달)
print(tuple(row))
conn.commit() # 데이터베이스에 변경사항 적용
for i, row in df.iterrows():
print(row)
for i, row in df.iterrows():
print(tuple(row))
cursor.execute("SELECT * FROM police_station")
result = cursor.fetchall()
for row in result:
print(row)
df = pd.DataFrame(result)
df.tail()
여기서 Tip, 특히 우리나라 사이트에서 제공받은 CSV 파일들이 한글이 깨지는 경우, encoding 값을 'euc-kr'
로 설정하기
import pandas as pd
df = pd.read_csv('2020_crime.csv', encoding='euc-kr')
df.head()
Example 1: crime_status 테이블에 2020_crime.csv 데이터를 입력하는 코드를 작성하기
1) AWS RDS (database-1) zerobase 접속
import mysql.connector
conn = mysql.connector.connect(
host = "database-1.cr8sy4u8g6l2.us-east-2.rds.amazonaws.com",
port = 3306,
user = "zero",
password = "1234",
database = "zerobase"
)
2) 2020_crime.csv 데이터(encoding='euc-kr') 읽기
import pandas as pd
df = pd.read_csv('2020_crime.csv', encoding='euc-kr')
df.head(2)
import pandas as pd
df = pd.read_csv("2020_crime.csv")
df.head(2)
위와 같은 query를 입력하니 'utf-8'이라고 하면서 에러가 뜨는걸 확인할 수 있다.
3) INSERT문 query 작성
sql = """INSERT INTO crime_status VALUES ("2020", %s, %s, %s, %s)"""
cursor = conn.cursor(buffered=True)
/*2020년도는 해당 파일이 2020년도 데이터이기 때문에 데이터에 없어
일괄적으로 파일에 들어가야하기 때문에 고정으로 2020 넣기*/
4) 데이터를 crime_status 테이블에 INSERT
for i, row in df.iterrows():
cursor.execute(sql, tuple(row))
print(tuple(row))
conn.commit()
5) crime_status 테이블의 데이터 조회
cursor.execute("SELECT * FROM crime_status")
result = cursor.fetchall()
for row in result:
print(row)
6) 조회한 데이터 결과를 Pandas로 변환해서 확인
df = pd.DataFrame(result)
df.head()