# zerobase 데이터베이스의 police_station 테이블을 backup_police.sql로 백업
mysqldump --set-gtid-purged=OFF -h "database-1.cpys04aeky7e.ap-northeast-2.rds.amazonaws.com" -P 3306 -u admin -p zerobase police_station > backup_police.sql
# 내 AWS RDS 접속
mysqldump -h "database-1.cpys04aeky7e.ap-northeast-2.rds.amazonaws.com" -P 3306 -u admin -p zerobase
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| zerobase |
+--------------------+
5 rows in set (0.01 sec)
# zerobase 데이터베이스 선택
mysql> use zerobase
mysql> show tables;
+--------------------+
| Tables_in_zerobase |
+--------------------+
| celeb |
| crime_status |
| police_station |
| snl_show |
+--------------------+
4 rows in set (0.01 sec)
# 저장되어있는 police_station의 데이터 삭제
mysql> delete from police_station;
Query OK, 0 rows affected (0.06 sec)
mysql> show tables;
+--------------------+
| Tables_in_zerobase |
+--------------------+
| celeb |
| crime_status |
| police_station |
| snl_show |
+--------------------+
4 rows in set (0.01 sec)
mysql> select * from police_station;
Empty set (0.01 sec)
pip install mysql-connector-python
import mysql.connector
#Local Database 연결
mydb = mysql.connector.connect(
host = "localhost",
user = "root",
password = "<password>"
#데이터베이스 지정해서 접근하려면, database="<databasename>"
)
# 종료 필수! 연결이 너무 많아지면 안됨!
mydb.close()
# AWS RDS(database-1) 연결
remote = mysql.connector.connect(
host = "database-1.cpys04aeky7e.ap-northeast-2.rds.amazonaws.com",
port= 3306, #원격이니까
user = "admin",
password = "<password>"
#데이터베이스 지정해서 접근하려면, database="<databasename>"
)
cur = remote.cursor()
cur.execute("CREATE TABLE sql_file (id int, filename varchar(16))")
=> 터미널에서 desc sql_file로 확인해보면, 생성되어 있음
mysql> desc sql_file;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| filename | varchar(16) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
2 rows in set (0.02 sec)
cur = remote.cursor()
cur.execute("DROP TABLE sql_file")
=> 터미널에서 desc sql_file로 확인해보면, 존재하지 않아 오류 발생
mysql> desc sql_file;
ERROR 1146 (42S02): Table 'zerobase.sql_file' doesn't exist

cur = remote.cursor()
sql = open("test03.sql").read()
cur.execute(sql)
cursor 생성 -> sql파일을 open 및 read 한 후 -> cursor에서 sql을 실행
mysql> desc sql_file;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| filename | varchar(16) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
=> 테이블이 잘 생성되어 있음을 확인

cur = remote.cursor()
sql = open("test04.sql").read()
#multi=True 옵션을 주면 sql에 담긴 것을 여러 번 실행하게 됨.
for result_iterator in cur.execute(sql, multi=True): #여러번 실행하는 것을 result_iterator로 받아옴
if result_iterator.with_rows: #결과값이 여러 개인 경우에는
print(result_iterator.fetchall()) #fetchall: 결과를 모두 받아와서 찍음
else:
print(result_iterator.statement)
remote.commit() #database에 적용하기 위한 명령
remote.close()
....
INSERT INTO sql_file VALUE (1, "test01.sql")
INSERT INTO sql_file VALUE (2, "test02.sql")
INSERT INTO sql_file VALUE (3, "test03.sql")
INSERT INTO sql_file VALUE (4, "test04.sql")
잘 생성되어있는지 확인해보자!
mysql> select * from sql_file;
+------+------------+
| id | filename |
+------+------------+
| 1 | test01.sql |
| 2 | test02.sql |
| 3 | test03.sql |
| 4 | test04.sql |
+------+------------+
4 rows in set (0.02 sec)
=> 테이블이 안에 값이 잘 들어가졌음을 확인
cur = remote.cursor(buffered=True)
# buffered=True: 읽어올 데이터 양이 많은 경우
cur.execute("SELECT * FROM sql_file")
result = cur.fetchall()
print("1) print(result):", result) # 한번에 다 출력되어서 나옴
print("------2) 한줄씩 출력해보기------")
#한줄씩 출력해보기
for result_iterator in result:
print(result_iterator)
remote.close()
...
1) print(result): [(1, 'test01.sql'), (2, 'test02.sql'), (3, 'test03.sql'), (4, 'test04.sql')]
------2) 한줄씩 출력해보기------
(1, 'test01.sql')
(2, 'test02.sql')
(3, 'test03.sql')
(4, 'test04.sql')
import pandas as pd
df = pd.DataFrame(result)
df.head()
...
0 1
0 1 test01.sql
1 2 test02.sql
2 3 test03.sql
3 4 test04.sql
cur = remote.cursor(buffered=True)
cur.execute()
sql = "INSERT INTO police_station VALUES (%s, %s)"
# %s: string으로 받겠다는 뜻
for i, row in df.iterrows():
cur.execute(sql, tuple(row))
#df 한줄씩 담긴 string 값 두개를 sql에 담아서 실행
# => 즉 df의 값을 police_station 테이블에 넣음
print(tuple(row))
remote.commit()
# 데이터 잘 들어갔는지 확인해보기
cur.execute("SELECT * FROM police_station")
result = cur.fetchall()
for row in result:
print(row)