ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Python 기초 공부 - 5 (mariaDB 연동)
    Programming/Python 2021. 3. 7. 14:30
    반응형

    Maria DB연동 진행

     

    연결 방법

    import pymysql
    def sql_connect():
        
        conn = pymysql.connect(host='localhost', # host 주소 입력 ip주소
                               user='username', # db에 접근할 user id
                               port=8888, # host의 port번호
                               password='password', # 비밀번호
                               db='dbname', # 접속할 DB이름
                               charset='utf8mb4', use_unicode=True,
                               cursorclass=pymysql.cursors.DictCursor)
        return conn

     

    Select 사용시

    
    def select(date):
    
      conn = sql_connect()
      cur = conn.cursor()
      sql ="""SELECT * FROM Connection_ip where date>= (%s)""" # 쿼리문 입력 '%s' 적으면 동적으로 변경가능
      cur.execute(sql, '%s'%(date)) # 쿼리문 db로 전달
      row = cur.fetchall() # 결과값 반환
      contents = []
      for pet in row: # 결과 값을 언팩 후 values들만 입력
          pet_val = list(pet.values())
          contents.append(pet_val)
      conn.close()
      return contents

    select은 sql 자체내에서 결과를 확인하기 보다는 결과 값을 받아와서 pandas로 처리하면 편하기에 python을 연동해서

    사용하는 것을 추천합니다.

    그리고 사용이 끝나면 close() 메서드를 이용해서 연결을 해제합니다.

     

    Insert 사용시

    def insert(name,email,text,ip,date):
    
      conn = sql_connect()
      cur = conn.cursor()
      sql ="""INSERT INTO inquire (name, email, text, IP_address, mmdd)
      VALUES(%s, %s, %s, %s, %s)"""
    
      cur.execute(sql, ('%s'%(name), '%s'%(email),'%s'%(text), '%s'%(ip), '%s'%(date)))
      cur.commit()
      conn.close() # 커넥트 해제

    select과는 다르게 commit() 메서드를 이용하셔야 db내에선 저장을 합니다.

    안하면 입력 후 종료와 동시에 사라집니다.

    INTO = 중복없음

    ignore INTO = 중복가능

     

    Update

    def update(before,after):
    
      conn = sql_connect()
      cur = conn.cursor()
      
      sql = 'update inquire set name=%s where name = %s'
    
      cur.execute(sql, ('%s'%(before), '%s'%(after)))
      cur.commit()
      conn.close() # 커넥트 해제

    업데이트 또한 간단하게 작성이 가능합니다.

     

    Delete

    def delete(name,who):
    
      conn = sql_connect()
      cur = conn.cursor()
      
      sql = 'delete from inquire where %s=%s'
    
      cur.execute(sql, ('%s'%(name), '%s'%(who)))
      cur.commit()
      conn.close() # 커넥트 해제


    # 그외 학생 테이블 구축

    import pymysql
    class Student:
        def __init__(self):
            self.bunho=0
            self.name=''
            self.kor=0
            self.mat=0
            self.eng=0
            self.total=0
            self.average=0
            self.grade=''
        def inputData(self):
            self.name=input("이름을 입력하시오")
            self.kor=eval(input("국어점수:"))
            self.mat=eval(input("수학점수:"))
            self.eng=eval(input("영어점수:"))
            
        def calc_total_average(self):
            self.total=self.kor+self.mat+self.eng
            self.average=round(self.total/3,2)
            self.grade = self.calcSemGrade()
            
        def calcSemGrade(self):
            if self.average>=90:
                return "A"
            elif self.average>=80:
                return "B"
            elif self.average>=70:
                return "C"
            elif self.average>=60:
                return "D"
            else:
                return "F"
        def __str__(self):
            return '%5s %5s %6s %6s %6s %7s %7s %s' % (self.bunho, self.name,
                                                      self.kor, self.mat,self.eng,self.total,
                                                      self.average, self.grade)
        def __cmp__(self,other):
            return self.name == other.name
        def __call__(self,other): # 클래스를 함수처럼 사용하고자할때 오버라이딩.
            st = []
            for student in other:
                stp = Student()
                stp.name=student[0]
                stp.kor=student[1]
                stp.eng=student[2]
                stp.mat=student[3]
                st.append(stp)
            return st
    class maria:
        schoolname = "school"
        def __init__(self):
            self.conn = pymysql.connect(host='localhost', port=3306, user='root',
                               password='root',db='school', charset='utf8',
                                        autocommit=True)
            cor = self.conn.cursor()
            cor.execute("SHOW TABLES")
            tables = cor.fetchall()
            c = []
            for i in tables:
                if  i == ('sungjuk',):
                    c.append(i)
            if len(c) != 0:
                sungjuk_table = "SELECT * FROM sungjuk"
                cor.execute(sungjuk_table)
                print('테이블이 있습니다. ')
            else:
                cor.execute("CREATE TABLE sungjuk (name VARCHAR(20), kor INTEGER(20),  mat INTEGER(20),eng INTEGER(20))")
                print('sungjuk테이블을 생성하였습니다. ')
        def __del__(self):
            self.conn.close()
    
        def selectdb(self ):
            cur = self.conn.cursor()
            cur.callproc("sungjuk_select")
            if (cur.rowcount):
                stu = list(cur.fetchall())
            else :
                stu = 0;
            cur.close()
            return stu
       
        def insertdb(self,name, kor, mat, eng):
            cur = self.conn.cursor()
            args = (name, kor, mat, eng)
            cur.callproc("sungjuk_insert",args)
            cur.close()
           
        def updatedb(self, in_name, up_name):
            cur = self.conn.cursor()
            args = (in_name, up_name, 0)
            cur.callproc("sungjuk_update", args)
            cur.execute('SELECT @_sungjuk_update_2')
            result = cur.fetchone()
            if result==2 :
                print("수정할 이름이 없습니다.")
            else :
                print("성공적으로 수정하였습니다. ")
            cur.close()
            return result 
       
        def deletedb(self,in_name):
            cur = self.conn.cursor()
            args = (in_name, 0)
            cur.callproc("sungjuk_delete", args)
            cur.execute('SELECT @_sungjuk_delete_1')
            result = cur.fetchone()
            if result==2 :
                print("삭제할 이름이 없습니다.")
            else :
                print("성공적으로 삭제하였습니다. ")
            cur.close()
            return result
    from math import  *
    from statistics import *
    
    class Management:
        def __init__(self):
            self.maria = maria()
        def M_select(self):
            data = self.maria.selectdb()
            st = []
            if (data):
                for student in data:
                    stp = Student()
                    stp.bunho = student[0]
                    stp.name = student[1]
                    stp.kor = student[2]
                    stp.eng = student[3]
                    stp.mat = student[4]
                    stp.total = student[5]
                    stp.average = student[5]
                    st.append(stp)                    
                # studdata=Student((data))
                print(maria.schoolname + "  성적 계산표 ")
                print('%5s %5s %6s %6s %6s %6s  %6s %6s' % ('번 호', '이 름', '국 어',
                        '수 학', '영  어', '총 점', '평 균', '학 점' ))      
                for stud in st:
                    print( stud)                     
            else :
                print("데이터가 없습니다. . ")
               
        def M_insert(self):
            stu = Student()
            stu.inputData()
            self.maria.insertdb(stu.name, stu.kor, stu.mat, stu.eng)
        def M_update(self):
            name = input("검색할 이름을 입력하시요")
            replace_name = input("수정할 이름을 입력하시요")
            result=self.maria.updatedb(name, replace_name)  
        def M_delete(self):       
            name = input("검색할 이름을 입력하시요")
            self.maria.deletedb(name)   
    import pymysql
    import sys
    class Menu():
        def __init__(self):
            self.manage = Management()
           
        def work(self):
            menu = [ "전체검색(1), 입력(2), 수정(3), 삭제(4), 종료(9)"]
            manage = Management()
            while 1:
                sel = input(menu)
                if  sel == "1":
                    manage.M_select()
                    continue
                elif sel == "2":
                    manage.M_insert()
                    continue       
                elif sel =="3":
                    manage.M_update()
                    continue
                elif sel =="4":
                    manage.M_delete()
                elif sel =="9":
                    del(manage)
                    sys.exit()
                else :
                    print("잘못된 입력입니다. 다시입력 하시요")
                    continue       
    menu = Menu()
    menu.work() 
    반응형

    'Programming > Python' 카테고리의 다른 글

    Python 기초 공부 - 8 (Pandas,numpy)  (0) 2021.03.09
    Python 기초 공부 - 6 (Pandas)  (0) 2021.03.08
    Python 기초 공부 - 4  (0) 2021.03.06
    Python 기초 공부 - 3  (0) 2021.03.05
    Python 기초 공부 - 2  (0) 2021.03.04
Designed by Tistory.