conn = pymysql.connect(host='127.0.0.1',
user='crawluser',
password='********',
db='crawlDB',
charset='utf8')
cur = conn.cursor()
sql = 'SELECT * FROM customer;'
cur.execute(sql)
- 출력
11
fetchone() : 한 행씩 데이터 추출fetchall() : 모든 행의 데이터 추출cur.fetchone()
- 출력
(1, '김바람', '010-123-1111', datetime.date(2000, 1, 1))
cursor 가 fetchone() 을 실행하며 현재 커서 위치가 첫 번째 행을 조회하고 지나쳐 두 번째 행에 위치한 상태이다.fetchall() 을 진행했을 때 두 번째행부터 출력되는 모습이다.cur.fetchall()
- 출력
((2, '남구름', '010-222-1111', datetime.date(2010, 1, 1)),
(3, '서바다', '010-321-2111', datetime.date(2001, 5, 1)),
(4, '홍하늘', '010-123-1311', datetime.date(2010, 2, 1)),
(5, '이방', '010-443-1111', datetime.date(1981, 10, 10)),
(6, '성춘향', '010-123-3333', datetime.date(2010, 10, 10)),
(7, '이몽룡', '010-444-7777', datetime.date(2009, 5, 10)),
(8, '강하늘', '010-777-3333', datetime.date(2011, 10, 10)),
(9, '최장군', '010-555-7777', datetime.date(2019, 5, 10)),
(10, '성자', '010-123-0099', datetime.date(2001, 3, 10)),
(11, '방식', '010-444-7788', datetime.date(2008, 12, 10)))
fetchone() 으로 모든 행을 추출 가능None 반환# 이미 앞서 fetchall() 로 모든 행을 추출하여 추출할 행이 존재하지 않는다.
cur.fetchone()
fetchone() 으로 tuple 형태의 행을 가져오고 끝까지 조회한 경우 반복문을 종료, 튜플 데이터에 인덱스로 접근하여 딕셔너리들의 리스트를 생성한다.cur.execute('SELECT * FROM customer;')
rows = []
while True:
row = cur.fetchone() # tuple 형식으로 한 행 가져옴
dic = {}
if row is None:
break
dic['id'] = row[0]
dic['name'] = row[1]
dic['tel'] = row[2]
dic['birth'] = row[3]
rows.append(dic)
rows
- 출력
[{'id': 1,
'name': '김바람',
'tel': '010-123-1111',
'birth': datetime.date(2000, 1, 1)},
{'id': 2,
'name': '남구름',
'tel': '010-222-1111',
'birth': datetime.date(2010, 1, 1)},
{'id': 3,
'name': '서바다',
'tel': '010-321-2111',
'birth': datetime.date(2001, 5, 1)},
...
'birth': datetime.date(2001, 3, 10)},
{'id': 11,
'name': '방식',
'tel': '010-444-7788',
'birth': datetime.date(2008, 12, 10)}]
cur.fetchone() 은 None 을 반환한다. print() 를 하여야 None 을 출력, 단독 실행시 실행결과는 없다.print(cur.fetchone())
- 출력
None
rows 는 fetchone() 을 반복하여 새로운 딕셔너리의 리스트로 생성하였고 rows2 는 fetchall() 을 실행하여 튜플 안의 튜플 형태의 데이터다.cur.execute('SELECT * FROM customer;')
rows2 = cur.fetchall()
rows2
- 출력
((1, '김바람', '010-123-1111', datetime.date(2000, 1, 1)),
(2, '남구름', '010-222-1111', datetime.date(2010, 1, 1)),
(3, '서바다', '010-321-2111', datetime.date(2001, 5, 1)),
(4, '홍하늘', '010-123-1311', datetime.date(2010, 2, 1)),
(5, '이방', '010-443-1111', datetime.date(1981, 10, 10)),
(6, '성춘향', '010-123-3333', datetime.date(2010, 10, 10)),
(7, '이몽룡', '010-444-7777', datetime.date(2009, 5, 10)),
(8, '강하늘', '010-777-3333', datetime.date(2011, 10, 10)),
(9, '최장군', '010-555-7777', datetime.date(2019, 5, 10)),
(10, '성자', '010-123-0099', datetime.date(2001, 3, 10)),
(11, '방식', '010-444-7788', datetime.date(2008, 12, 10)))
import pandas as pd
# rows : 딕셔너리들의 리스트
df = pd.DataFrame(data=rows)
df
- 출력
| id | name | tel | birth | |
|---|---|---|---|---|
| 0 | 1 | 김바람 | 010-123-1111 | 2000-01-01 |
| 1 | 2 | 남구름 | 010-222-1111 | 2010-01-01 |
| 2 | 3 | 서바다 | 010-321-2111 | 2001-05-01 |
| 3 | 4 | 홍하늘 | 010-123-1311 | 2010-02-01 |
| 4 | 5 | 이방 | 010-443-1111 | 1981-10-10 |
| 5 | 6 | 성춘향 | 010-123-3333 | 2010-10-10 |
| 6 | 7 | 이몽룡 | 010-444-7777 | 2009-05-10 |
| 7 | 8 | 강하늘 | 010-777-3333 | 2011-10-10 |
| 8 | 9 | 최장군 | 010-555-7777 | 2019-05-10 |
| 9 | 10 | 성자 | 010-123-0099 | 2001-03-10 |
| 10 | 11 | 방식 | 010-444-7788 | 2008-12-10 |
rows2 는 column= 을 통해 컬럼명 지정이 필요하다. row 처럼 데이터프레임을 만들었더니 column 명이 숫자로 나온다.df2 = pd.DataFrame(data=rows2)
df2
- 출력
| 0 | 1 | 2 | 3 | |
|---|---|---|---|---|
| 0 | 1 | 김바람 | 010-123-1111 | 2000-01-01 |
| 1 | 2 | 남구름 | 010-222-1111 | 2010-01-01 |
| 2 | 3 | 서바다 | 010-321-2111 | 2001-05-01 |
| 3 | 4 | 홍하늘 | 010-123-1311 | 2010-02-01 |
| 4 | 5 | 이방 | 010-443-1111 | 1981-10-10 |
| 5 | 6 | 성춘향 | 010-123-3333 | 2010-10-10 |
| 6 | 7 | 이몽룡 | 010-444-7777 | 2009-05-10 |
| 7 | 8 | 강하늘 | 010-777-3333 | 2011-10-10 |
| 8 | 9 | 최장군 | 010-555-7777 | 2019-05-10 |
| 9 | 10 | 성자 | 010-123-0099 | 2001-03-10 |
| 10 | 11 | 방식 | 010-444-7788 | 2008-12-10 |
df2 = pd.DataFrame(data=rows2,
columns=['id', 'name', 'tel', 'birth'])
df2
- 출력
| id | name | tel | birth | |
|---|---|---|---|---|
| 0 | 1 | 김바람 | 010-123-1111 | 2000-01-01 |
| 1 | 2 | 남구름 | 010-222-1111 | 2010-01-01 |
| 2 | 3 | 서바다 | 010-321-2111 | 2001-05-01 |
| 3 | 4 | 홍하늘 | 010-123-1311 | 2010-02-01 |
| 4 | 5 | 이방 | 010-443-1111 | 1981-10-10 |
| 5 | 6 | 성춘향 | 010-123-3333 | 2010-10-10 |
| 6 | 7 | 이몽룡 | 010-444-7777 | 2009-05-10 |
| 7 | 8 | 강하늘 | 010-777-3333 | 2011-10-10 |
| 8 | 9 | 최장군 | 010-555-7777 | 2019-05-10 |
| 9 | 10 | 성자 | 010-123-0099 | 2001-03-10 |
| 10 | 11 | 방식 | 010-444-7788 | 2008-12-10 |
# 조회한 결과를 데이터프레임으로 생성하고 csv파일로 저장
df.to_csv('../customer.csv', index=False)
conn.close()
# DB 연결
conn = pymysql.connect(host='127.0.0.1',
user='crawluser',
password='12341234',
db='crawlDB',
charset='utf8')
# 조회
sql = 'SELECT * FROM customer;'
col_names = ['id', 'name', 'tel', 'birth']
try:
with conn.cursor() as cur:
cur.execute(sql)
rows = cur.fetchall() # 튜플들의 튜플, column 이름 필요
print(f'{len(rows)}행 조회!')
except Exception as e:
print(f'조회 실패! : {e}')
finally:
conn.close()
df = pd.DataFrame(data=rows, columns=col_names)