[select]
SQL 쿼리는 SELECT 문을 작성하여 execute() 메서드를 실행하면 된다. 아래 예제는 위에서 설명한 일반적인 MySql 사용 절차를 따른 것으로, 간단한 SELECT 문을 실행한 후, 전체 ROW 데이타를 출력하는 예이다.
import mysql.cnnector
# MySQL Connection 연결
conn =mysql.connect(host='localhost', user='tester', password='',
db='testdb', charset='utf8')
# Connection 으로부터 Cursor 생성
curs = conn.cursor()
# SQL문 실행
sql = "select * from customer"
curs.execute(sql)
# 데이타 Fetch
rows = curs.fetchall()
print(rows) # 전체 rows
# print(rows[0]) # 첫번째 row: (1, '김정수', 1, '서울')
# print(rows[1]) # 두번째 row: (2, '강수정', 2, '서울')
# Connection 닫기
conn.close()
위의 예제에서 몇가지 주목할 점은
(1) connect() 메서드에서 charset을 명시한 점이다. 종종 클라이언트의 charset이 제대로 설정되지 않으면 한글이 깨지는 경우가 발생할 수 있다.
(2) 커서의 fetchall() 메서드는 모든 데이타를 한꺼번에 클라이언트로 가져올 때 사용된다. 또다른 fetch 메서드로서 fetchone()은 한번 호출에 하나의 Row 만을 가져올 때 사용된다. fetchone()을 여러 번 호출하면, 호출 때 마다 한 Row 씩 데이타를 가져오게 된다. 그리고 fetchmany(n) 메서드는 n개 만큼의 데이타를 한꺼번에 가져올 때 사용된다.
(3) print(rows) 문은 전체 row들을 Tuple의 Tuple로서 출력하게 되고, row[0], row[1]와 같이 인덱스를 지정하면, 첫번째, 두번째 row 등을 가리키게 된다. 각 row는 Tuple로 리턴되며, 컬럼 순서대로 데이타가 표시된다 (주: 이러한 디폴트 Row 데이타 형식을 흔히 Array based cursor라 부르고, 이는 connect() 혹은 cursor() 메서드에서 옵션으로 변경할 수 있다. 아래 참조.).
하기 샘플코드로 활용할 Laptop Data의 컬럼은 Id, Name, Price, Purchase_date,
select한 후, 결과를 리스트로 받는 경우
- books 테이블 이용
query = "select* from laptop where id = %s" id = 3 param = (id,) cursor = connection.cursor() cursor.execute(query,param) # get all records records = cursor.fetchall() print("Total number of rows in table:",cursor.rowcount) print("\n Printing each row") for row in records: print("id=",row[0]) print("Nam=,",row[1]) print("Price=,",row[2]) print("Purchase date=,",row[3],"\n") |
select한 후, 결과를 딕셔너리로 받는 경우
- books 테이블 이용
query = "select* from laptop " # 아래처럼 딕셔너리의 키로 억세스가 가능함. cursor = connection.cursor(dictionary = True) cursor.execute(query) records = cursor.fetchall() print("Fetching each row using column name",cursor.rowcount) for row in records: id = row["id"] name = row["Name"] price = row["Price"] |
- cursor() 메서드 안에 DictCursor를 파라미터로 지정하였는데, 이는 디폴트인 Array based cursor가 아닌 Dictionary based cursor를 사용하겠다는 것을 의미한다.
디폴트 Array based cursor는 Row의 결과값을 배열로 (정확히는 튜플) 리턴하는데, cursor 생성시 DictCursor 옵션을 주면, Row 결과를 Dictionary 형태로 리턴한다.
- 위의 예에서 커서가 DictCursor이므로 for 루프 안의 print(row)는 Dictionary 형태로 Row 데이타를 출력하게 된다. 또한 Row 데이타가 Dictionary이므로 row["id"], row["Name"] 과 같이 컬럼명을 써서 컬럼값을 구할 수 있다.
- 이렇게 컬럼인덱스 대신 컬럼명으로 컬럼을 찾게 되면 코드 가독성을 높일 수 있고, 특히 컬럼수가 많을 경우 유용하게 사용될 수 있다.
참고 블로그:
http://pythonstudy.xyz/python/article/202-MySQL-%EC%BF%BC%EB%A6%AC