[MySQL] PyMySQL ② SELECT

Hunie_07·2026년 2월 22일

SQL

목록 보기
15/18
post-thumbnail

📌 PyMySQL (파이썬 연동)


0️⃣ MySQL 연결 및 Cursor 생성

conn = pymysql.connect(host='127.0.0.1',
					   user='crawluser',
                       password='********',
                       db='crawlDB',
                       charset='utf8')
cur = conn.cursor()

1️⃣ MySQL 데이터 조회

  • 출력결과는 조회한 행 개수를 출력
sql = 'SELECT * FROM customer;'
cur.execute(sql)

- 출력

11

2️⃣ 데이터 추출

  • fetchone() : 한 행씩 데이터 추출
  • fetchall() : 모든 행의 데이터 추출
cur.fetchone()

- 출력

(1, '김바람', '010-123-1111', datetime.date(2000, 1, 1))
  • cursorfetchone() 을 실행하며 현재 커서 위치가 첫 번째 행을 조회하고 지나쳐 두 번째 행에 위치한 상태이다.
  • 따라서 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

3️⃣ 추출한 데이터를 데이터프레임으로 생성

  • 앞서 rowsfetchone() 을 반복하여 새로운 딕셔너리의 리스트로 생성하였고 rows2fetchall() 을 실행하여 튜플 안의 튜플 형태의 데이터다.
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

  • rows2column= 을 통해 컬럼명 지정이 필요하다. 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

4️⃣ 조회 데이터 파일 저장

# 조회한 결과를 데이터프레임으로 생성하고 csv파일로 저장
df.to_csv('../customer.csv', index=False)

5️⃣ MySQL 연결 종료

conn.close()

6️⃣ 전체 코드

# 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)

0개의 댓글