오늘은 jupyter notebook 에서 작성했다
1. mysqlclient
- 파이썬에서는 MySQL 서버와 통신할 수 있는 파이썬용 데이터베이스 커넥터의 종류가 여러가지 있음
- PyMySQL, mysqlclient 가 가장 많이 사용되는 커넥터
- 사용법은 비슷하나 속도가 빠른 mysqlclient를 권장하고 있음
mysqlclient을 사용하기 위해 설치해준다
!pip install mysqlclient
그다음 import를 써서 MySQL데이터베이스를 불러온다
import MySQLdb
db에 연결해준다
# host: IP주소, localhost, 127.0.0.1
# user: 유저, root
# password: 비밀번호, 1234
# db: 데이터베이스, kdt
db = MySQLdb.connect(host='localhost', user='root', password='1234', db='kdt')
#db = MySQLdb.connect(localhost', root', 1234', 'kdt') # 순서만 지켜서 이렇게 써도 됨
2. cursor 생성하기
- 하나의 DataBase Connection에 대하여 독립적으로 SQL문을 실행할 수 있는 작업환경을 제공하는 객체
- 하나의 connection에 동시에 한 개의 cursor만 생성할 수 있으며, cursor를 통해 SQL문을 실행하면 실행결과를 튜플단위로 반환
cur = db.cursor() # 작업환경을 만들어줌 -> sql구문을 사용할 수 있게 됨
sql = 'select userid, username, hp, email, gender from member'
cur.execute(sql)
# cur.execute('select userid, username, hp, email, gender from member') # 이렇게 바로 써도 됨
>> 6
member 테이블에 데이터가 6줄 들어있어서 6이라고 나왔다
3. SQL문 결과 가져오기
- fetchall(): 한번에 모든 tuple을 가져옴. 검색 결과가 매우 크다면 메모리 오버헤드가 발생할 수 있음
- fetchone(): 한번에 하나의 tuple을 가져옴. 다시 메서드를 호출하면 다음 데이터 하나를 가져옴
fetchall()을 사용해서 전부 가져오기
row = cur.fetchall()
print(row)
>> (('apple', '김사과', '0', 'A@mail', 'F'), ('banana', '바나나', '0', 'B@mail', 'F'), ('berry', '배애리', '010-9999-9999', 'berry@mail', 'F'), ('grapes', '포도', '0', 'G@mail', 'F'), ('melon', '이메론', '0', 'M@mail', 'M'), ('orange', '오렌지', '0', 'O@mail', 'M'))
row = cur.fetchone()
print(row)
>> None
*위에서 이미 한번 돌았기 때문에 가져오지 않음, so 다시 실행하고 불러야 함
cur.execute(sql)
row = cur.fetchone()
print(row)
>>('apple', '김사과', '0', 'A@mail', 'F')
fetchone()을 이용해서 루프를 돌며 모든 데이터 출력하기
cur.execute(sql)
while True:
row = cur.fetchone()
if row:
print(row)
else:
break
>> ('apple', '김사과', '0', 'A@mail', 'F') ('banana', '바나나', '0', 'B@mail', 'F') ('berry', '배애리', '010-9999-9999', 'berry@mail', 'F') ('grapes', '포도', '0', 'G@mail', 'F') ('melon', '이메론', '0', 'M@mail', 'M') ('orange', '오렌지', '0', 'O@mail', 'M')
cursor에 dictionary형식으로 row를 유지하도록 내부 타입을 명시
cur = db.cursor(MySQLdb.cursors.DictCursor) # 이걸 해줘야 str 가져오기 가능
cur.execute(sql)
while True:
row = cur.fetchone()
if row:
# print(row) # 딕셔너리 굳이 안뽑아도 됨!
print(f"아이디: {row['userid']}, 이름: {row['username']}, 전화번호: {row['hp']}, 이메일: {row['email']}, 성별: {row['gender']}")
else:
break
>>
아이디: apple, 이름: 김사과, 전화번호: 0, 이메일: A@mail, 성별: F
아이디: banana, 이름: 바나나, 전화번호: 0, 이메일: B@mail, 성별: F
아이디: berry, 이름: 배애리, 전화번호: 010-9999-9999, 이메일: berry@mail, 성별: F
아이디: grapes, 이름: 포도, 전화번호: 0, 이메일: G@mail, 성별: F
아이디: melon, 이름: 이메론, 전화번호: 0, 이메일: M@mail, 성별: M
아이디: orange, 이름: 오렌지, 전화번호: 0, 이메일: O@mail, 성별: M
4. Cursor와 Connection 닫아주기
cur.close() #커서 닫기
db.close() #커넥션 닫기
5. 데이터 삽입하기
sql = "insert into member (userid, userpw, username, hp, email, gender, ssn1, ssn2) values(%s, %s, %s, %s, %s, %s, %s, %s);"
data = ('mandarin', '0000','귤','010-1111-1111', 'cit@cit', '남자', '000000','0000000')
cur.execute(sql, data)
db.commit()
sql = "insert into member (userid, userpw, username, hp, email, gender, ssn1, ssn2) values(%s, %s, %s, %s, %s, %s, %s, %s);"
data = [('mango', '0000','마앙고','010-0000-0000', 'm@mail', '남자', '000000','0000000'),('peach', '0000','복숭아','010-0000-0000', 'peach@mail', '남자', '000000','0000000')]
cur.executemany(sql, data)
db.commit()
이렇게 해주고 MySQL workbench로 돌아가서 테이블을 확인해보면 입력이 되어있는 것을 발견할 수 있다!
문제:
회원가입 프로그램 만들기
import MySQLdb
db = MySQLdb.connect(host='localhost', user='root', password='1234', db='kdt')
cur = db.cursor()
while True:
try:
userid = input('아이디를 입력하세요:')
userpw = input('비밀번호를 입력하세요:')
username = input('이름을 입력하세요:')
hp = input('전화번호를 입력하세요:')
email = input('이메일을 입력하세요:')
gender = input('성별을 입력하세요:')
ssn1 = input('주민번호 앞자리를 입력하세요:')
ssn2 = input('주민번호 뒷자리를 입력하세요:')
zipcode = input('우편번호를 입력하세요:')
address1 = input('주소를 입력하세요:')
address2 = input('상세 주소를 입력하세요:')
address3 = input('추가사항을 입력하세요:')
sql = "insert into member (userid, userpw, username, hp, email, gender, ssn1, ssn2, zipcode, address1, address2, address3) values(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s);"
data = (userid, userpw, username, hp, email, gender, ssn1, ssn2, zipcode, address1, address2, address3)
cur.execute(sql, data)
db.commit()
print('가입되었습니다')
break
except:
print('다시 입력하세요')
cur.close()
db.close()
6. 데이터 수정하기
db = MySQLdb.connect('localhost', 'root', '1234', 'kdt')
cur = db.cursor()
sql = "update member set zipcode='12345', address1='서울시', address2='강남구' "
result = cur.execute(sql)
db.commit()
if result > 0:
print('수정되었습니다')
else:
print('에러!')
문제:
로그인하기
import MySQLdb
db = MySQLdb.connect(host='localhost', user='root', password='1234', db='kdt')
cur = db.cursor()
userid = input('아이디를 입력하세요: ')
userpw = input('비밀번호를 입력하세요: ')
sql = 'select userid from member where userid = %s and userpw = %s'
data = (userid, userpw)
result = cur.execute(sql, data)
if result > 0:
print('로그인 되었습니다')
else:
print('아이디 또는 비밀번호가 틀렸습니다')
cur.close()
db.close()
7. 데이터 삭제하기
import MySQLdb
db = MySQLdb.connect('localhost', 'root', '1234', 'kdt')
cur = db.cursor()
sql = "delete from member where userid = 'avocado'"
result = cur.execute(sql)
db.commit()
if result > 0:
print('탈퇴되었습니다')
else:
print('오류')
'KDT 수업 > Python' 카테고리의 다른 글
[데이터분석] NUMPY 넘파이 (0) | 2023.05.30 |
---|---|
28. DB를 이용한 단어장 만들기 (0) | 2023.03.22 |
26. DAO, DTO, VO (0) | 2023.03.22 |
[파이썬] 20. 예외처리 (0) | 2023.03.14 |
[파이썬] 23.변수의 타입 (0) | 2023.03.14 |