본문 바로가기
개발/파이썬

23.03.22파이썬 mysqlclient

by 상달군 2023. 3. 22.
728x90

목차

1. 파이썬의 mysqlclient

  • mysqlclient
  • Cursor생성하기
  • SQL문 결과 가져오기
  • Cursor와 Connection 닫기
  • 데이터 삽입하기
  • 데이터 수정하기
  • 데이터 삭제하기
  • 문제) 회원가입 프로그램 작성
  • 문제) 로그인 프로그램 작성

27.파이썬과 MySQL연동

 

1. 파이썬의 mysqlclient

1-1.mysqlclient

  • 파이썬이랑 mysql은 전혀 다른 녀석 둘사이를 해석해주는 매개체가 존재한다면 소통이 가능하다!
    • PyMySQL이라는 라이브러리가 존재 하지만 우리는 mysqlclient를 사용할것이다.
    • PyMySQL은 순수 파이썬으로 만들어진 녀석 속도는 mysqlclient가 빠르다.
  • 파이썬에서는 MySQL 서버와 통신할 수 있는 파이썬용 데이터베이스 커넥터의 종류가 여러가지 존재한다.
  • PyMySQL, mysqlclient 두가지 가장 많이 사용한다.
  • 사용법은 비슷하나 파이썬에서는 속도가 빠른 mysqlclient를 권장 하고 있음

 

mysqlclient 설치 와 import 후 connect 까지 

사용법 -

MySQLdb.connect(host=' ip주소 또는 localhost', user='로그인ID', password='패쓰워드', db ='데이터베이스명' )

# 순서만 맞춰준다면 생략가능 대신 순서가 바꿔면 안된다 !

#mysqlclient 설치
!pip install mysqlclient

# import를 이용하여 잘 설치 되었는지 확인
import MySQLdb

# 커넥트 시도
db = MySQLdb.connect(host=' ip주소 또는 localhost', user='로그인ID', password='패쓰워드', db ='데이터베이스명' )

 

1-2.Cursor생성하기

  • 하나의 데이터베이스 connection에 대하여 독립적으로 SQL문을 실행할 수 있는 작업 환경을 제공하는 객체
  • 하나의 connection에 동시에 한 개의 cursor만 생성할 수 있으며, cursor를 통해 SQL문을 실행하면 실행결과를 튜플 단위로 반환 해준다.
  • 위에서 연결 시킨 db변수를 이용하여 만든다
# cur변수에 cursor을 생성해주고 sql변수에 SQL문을 넣어준다. 
cur = db.cursor()
sql = 'select userid, username, hp, email, gender from member'

cur.execute(sql) # 결과값 6을 반환 해준다. 이해를 쉽게 튜플 6개를 가져왔다 ~~

 

1-3.SQL문 결과 가져오기

  • 메소드 알아보기
  • fetchall() : 한번에 모든 튜플을 가져옴 -> 특징 -검색 결과가 매우 크다면 메모리 오버헤드가 발생할 수 있음
  • fetchone() : 한번에 하나의 튜플만 가져옴 -> 특징 - 다시 메소드를 호출하면 다음 데이터 하나를 가져옴
# 한번 실행후 다시 실행하면 커서가 오렌지 다음을 가르키고 있어서 값이 없음.
# 전체 튜플 다 가져오기 !
row = cur.fetchall()
print(row)

# 위에서 한번 출력 했기때문에 cur. execute(sql)을 사용 하지 않을경우 값이 없음
cur.execute(sql)

#한번에 하나의 튜플 가져오기 
row = cur.fetchone()
print(row)

# fetchone()을 이용하여 루프를 돌면서 모든 데이터를 한줄씩 출력하기 
cur.execute(sql)

while True:
    row = cur.fetchone()
    if row:
        print(row)
    else:
        break

1-4.Cursor와 Connection 닫기

  • Cursor와 Connection 을 닫아주는 이유
    • 자원 해제: Cursor와 Connection은 자원(resource)을 사용하므로, 이를 해제하지 않으면 메모리나 다른 자원이 부족해질 수 있습니다. 따라서, 이를 닫아주는 것은 자원을 효율적으로 관리하는 데에 중요합니다.
    • 보안: Cursor와 Connection을 닫아주지 않으면, 해당 연결이 계속 유지되어 있어 악의적인 공격에 취약해질 수 있습니다. 따라서, 이를 닫아주는 것은 시스템 보안에도 중요합니다.
    • 트랜잭션 관리: MySQL에서는 트랜잭션(Transaction)을 사용하여 데이터 일관성을 유지합니다. Cursor와 Connection을 닫아주지 않으면, 해당 트랜잭션이 계속 유지되어 있을 수 있으므로, 이를 닫아주는 것은 트랜잭션 관리에도 중요합니다.
    • 성능: Cursor와 Connection을 닫아주지 않으면, 해당 연결이 계속 유지되어 있어 성능이 저하될 수 있습니다. 따라서, 이를 닫아주는 것은 시스템 성능 향상에도 중요합니다.
cur.close() #Cursor 닫기 
db.close() #Connection 닫기

1-5.데이터 삽입하기

# values값을 문자열로 넣기 위해서 %s처리 한다. 
#%s에 값을 넣어주기 위해서 data변수에 값을 저장해준다. 
sql = "insert into member (userid, userpw, username, hp, email, gender, ssn1, ssn2) values ( %s, %s, %s, %s, %s, %s, %s, %s)"
data =  ('avocado2', '0000', '아보카', '010-1211-1551', 'apple@apple.com', '남자', '001011', '1111111')

# sql쿼리에 data값을 넣어 준다  쉼표기준으로 오른쪽을 왼쪽에 넣어준다. 
cur.execute(sql, data)

# commit을 해줘야 값이 즉시반영이 된다. 
db.commit()
 

1-6. 데이터 수정하기

sql = "update member set zipcode='1234', address1='서울시',address2='강남구',address3='역삼동' where userid = 'avocado2'"
result = cur.execute(sql)
db.commit()

if result > 0:
    print('수정되었습니다. ')
else:
    print('에러!')

1-7.데이터 삭제하기 

import MySQLdb
db = MySQLdb.connect(host="localhost", user="root", passwd="1234", db="kdt")
cur = db.cursor()

sql = "delete from member where userid = 'avocado2'"
result = cur.execute(sql)
db.commit()

if result > 0 :
    print('탈퇴 되었습니다. ')
else:
    print('오류발생')


#cur.close() #커서 닫기 
#db.close() #커넥션 닫기

 

1-8.문제) 회원가입 프로그램 작성

  • ************ 회원가입 ************
  • 아이디를 입력하세요. (중복되면 다시 입력 받기)
  • 비밀번호를 입력하세요
  • 이름을 입력 하세요
  • 휴대폰 번호를 입력하세요.
  • 이메일을 입력하세요.
  • 성별을 입력하세요.
  • 주민번호 앞자리를 입력하세요.
  • 주민번호 뒷자리를 입력하세요.
  • 우편번호를 입력하세요
  • 주소를 입력하세요
  • 상세주소를 입력하세요 .
  • 참고 사항을 입력하세요.

가입 되었습니다. 오류처리 ->> 다시 입력하도록

import MySQLdb

db = MySQLdb.connect('localhost','root', '1234', 'kdt')
cur = db.cursor()

while True:
    try:
        userid = input('ID을 입력하세요. ')
        userpw = input('PW를 입력하세요. ')
        username  = input('이름을 입력하세요. ')
        hp = input('HP 을 입력하세요. ')
        email = input('Email을 입력하세요. ')
        gender = input('성별을 입력하세요. ')
        ssn1 = input('주민 앞자리을 입력하세요. ')
        ssn2 = input('주민 뒷자리을 입력하세요. ')
        zipcode = input('우편번호을 입력하세요. ')
        address1 = input('주소1을 입력하세요. ')
        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() #커넥션 닫기

1-9.문제) 로그인 프로그램 작성

  • 로그인 프로그램을 작성해보자.
  • ********** 로그인 **********
  • 아이디를 입력하세요 : apple
  • 비밀번호를 입력하세요 : 1234
  • 로그인 되었습니다.
  • 아이디를 입력하세요 : apple
  • 비밀번호를 입력하세요 : 0000
  • 아이디 또는 비밀번호가 틀렸어요.
import MySQLdb
db = MySQLdb.connect(host="localhost", user="root", passwd="1234", db="kdt")
cur = db.cursor()

userid = input('ID을 입력하세요. ')
userpw = input('PW를 입력하세요. ')

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() #커넥션 닫기

 

728x90

댓글