ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬 DB연결 회원관리 프로그램 (웹X, 콘솔구현)
    일단 만들기 2022. 2. 15. 22:48

    MySQL, 파이썬(IDE 파이참)을 이용,  DB연동 후 회원관리 프로그램 콘솔에서 구현하기.

     

    자바로 했을 때랑 구현 방식은 거의 같다고 느껴지지만...

    파이썬이 문법은 더 쉽다고 생각은 하지만...

    그래도 여전히 머리에서 정리가 잘 안되는 프로그램 구현하기

     

     

    코드 쓰면서 배우고

    오류나면 해결하면서 배우고

    복붙하면서 배우고

    구글링하면서 배우고~!

     


    구현할 기능들 : 

     

    <회원관리>
    회원가입
    로그인
    내정보확인 / 수정
    로그아웃
    탈퇴


    일단 MySQL 워크벤치에서 스케마 DB만들어주고...

     

     

     

     

     

    create table member(
        id varchar(20) primary key,
        pwd varchar(20),
        name varchar(20),
        email varchar(50)
    );

    파이참으로 파이썬 코드를 작성한다.

     

     

    디렉토리 구성은 이렇게 했다.

     

     

     


     

    __init__.py

    #__init__.py
    
    __all__=[
        'vo',
        'dao_db.py',
        'service',
        'menu'
    ]

     

     

    dao_db.py

    #dao_db.py
    
    import pymysql
    from member.vo import Member
    
    #Dao
    class MemberDao:
        def __init__(self):
            self.conn = None
    
        def connect(self):
            self.conn = pymysql.connect(host='localhost', user='아이디', password='비번', db='연결할 디비 이름', charset='utf8')
    
        def disconn(self):
            self.conn.close()
    
        # 추가 메서드
        def insert(self, a:Member):
            #1. db 커넥션 수립
            self.connect()
    
            # 2. 사용할 cursor객체 생성. db 작업 메서드가 이 클래스에 정의되어 있으므로 꼭 필요.
            cursor = self.conn.cursor()
    
            # 3. 실행할 sql문 정의
            sql = 'insert into member(id, pwd, name, email) values(%s, %s, %s, %s)'
    
            # 4. sql 문에 %s를 사용했다면 각 자리에 들어갈 값을 튜플로 정의
            d = (a.id, a.pwd, a.name, a.email)
    
            # 5. sql 실행(실행할 sql, %s매칭한 튜플)
            cursor.execute(sql, d)
    
            # 6. 쓰기동작(insert, update, delete) 에서 쓰기 완료
            self.conn.commit()
    
            # db 커넥션 끊음
            self.disconn()
    
            # 검색 메서드
        def select(self, id:str): #num(pk) 기준 검색. 1개 검색
            try:
                self.connect() #db 연결
                cursor = self.conn.cursor() #사용할 커서 객체 생성
                sql = 'select * from member where id=%s'
                d = (id,)
                cursor.execute(sql, d) #sql 실행
                row = cursor.fetchone() #fetchone(): 현재 커서 위치의 한줄 추출
                if row:
                    return Member(row[0], row[1], row[2], row[3])
    
            except Exception as e:
                print(e)
            finally:
                self.disconn()
    
    
    
        # 검색 메서드
        def selectByName(self, name:str): #name 기준 검색. 여러개 검색
            try:
                self.connect()  # db연결
                cursor = self.conn.cursor()  # 사용할 커서 객체 생성
                sql = 'select*from member where name like %s'
                d = (name,)
                cursor.execute(sql, d)  # sql 실행
                res =[Member(row[0], row[1], row[2], row[3]) for row in cursor]
    
                return res
    
            except Exception as e:
                print(e)
            finally:
                self.disconn()
    
    
        # 삭제(name)
        def delete(self, id:str):
            try:
                self.connect()
                cursor = self.conn.cursor()
                sql = 'delete from member where id = %s'
                d = (id,)
                cursor.execute(sql, d)
                self.conn.commit()
    
                return print('삭제가 완료되었습니다.')
    
            except Exception as e:
                print(e)
            finally:
                self.disconn()
    
    
        def update(self, a:Member):
            try:
                self.connect()
                cursor = self.conn.cursor()
                sql = 'update member set pwd=%s, name=%s, email=%s where id=%s'
    
                d = (a.pwd, a.name, a.email, a.id)
                cursor.execute(sql, d)
                self.conn.commit()
    
                return print('수정 완료')
    
            except Exception as e:
                print(e)
            finally:
                self.disconn()
    
        def selectAll(self):
            try:
                self.connect()
                cursor = self.conn.cursor()
                sql = 'select * from member'
                cursor.execute(sql)
                res = [Member(row[0], row[1], row[2], row[3]) for row in cursor]
                return res
    
            except Exception as e:
                print(e)
    
            finally:
                self.disconn()

     

    menu.py

    #menu.py
    
    from member.service import MemberService
    
    class Menu:
        def __init__(self):
            self.service=MemberService()
    
        def run(self):
            while True:
                m = input('1.회원가입 2.로그인 3.내 정보확인/수정 4.로그아웃 5.탈퇴 6.종료 \n')
                if m=='1':
                    self.service.addMember()
                elif m=='2':
                    self.service.login()
                elif m=='3':
                    self.service.printMyInfo()
                elif m=='4':
                    self.service.logout()
                elif m=='5':
                    self.service.delMember()
                elif m=='6':
                    break
    
    if __name__ == '__main__':
        m = Menu()
        m.run()

     

    service.py

    #service.py
    
    from member.vo import Member
    from member.dao_db import MemberDao
    
    # service
    class MemberService:
        loginId = ''
    
        def __init__(self):
            self.dao=MemberDao()
    
    
        #추가. name 중복 허용 안됨
        def addMember(self):
            print('=== 추가 ===')
    
            id = input('id:')
            pwd = input('pwd:')
            name = input('name:')
            email = input('email:')
            self.dao.insert(Member(id=id, pwd=pwd, name=name, email=email))
    
        def getById(self):
            print('=== 아이디로 검색 ===')
            id = int(input('search id:'))
            a:Member = self.dao.select(id)
            if a == None:
                print('없는 번호')
            else:
                print(a)
    
    
        #검색: 검색할 이름을 입력받아서 dao로 검색한 결과 출력
        def printMember(self):
            print('=== 이름으로 검색 ===')
            name = input('name:')
            res = self.dao.selectByName('%'+name+'%')
            if res==None: #중복 안됨
                print('예외발생')
            elif len(res)==0:
                print('검색결과 없음')
            else:
                for i in res:
                    print(i)
    
    
        #삭제
        def delMember(self):
            print('=== 삭제 ===')
            if MemberService.loginId != '':
                print('로그인 하세요')
                return
            id = input('id:')
            self.dao.delete(id)
    
        #전체출력
        def printAll(self):
            print('=== 전체출력 ===')
            data = self.dao.selectAll()
            for i in data:
                print(i)
    
        def login(self):
            if MemberService.loginId != '':
                print('이미 로그인중')
                return
            id=input('아이디 : ')
            a = self.dao.select(id)
    
            if a==None:
                print('없는 아이디')
                return
            else:
                pwd=input('패스워드 :')
                if pwd == a.pwd:
                    MemberService.loginId = id
                    print('로그인 성공')
                else:
                    print('패스워드(이름) 불일치')
    
        def printMyInfo(self): #로그인 상태에서만 사용가능
            if MemberService.loginId == '':
                print('로그인 먼저 하세요')
                return
            else:
                a=self.dao.select(MemberService.loginId)
                print(a)
                print('=== 수정 ===')
                # id = input('id:')
                # a:Member = self.dao.select(num) #수정전 데이터 검색
                #
                # if a == None:  # 중복 안됨
                #     print('가입되지 않았습니다')
                # else:
                s = ['pwd', 'name', 'email']
                data=[input('new' + s[i]+':') for i in range(len(s))]
                for idx, i in enumerate(data):
                    if i != '':
                        #객체 멤버 변수 수정
                        a.__setattr__(s[idx], i)
    
                self.dao.update(a)
    
    
        def logout(self):
            if MemberService.loginId == '':
                print('로그인 먼저 하시오')
                return
            MemberService.loginId = ''
            print('로그아웃 완료!')

     

    vo.py

    #vo.py
    
    class Member:
        def __init__(self, id=None, pwd=None, name=None, email=None):
            self.id = id
            self.pwd = pwd
            self.name = name
            self.email = email
    
        def __str__(self):
            return 'id:'+self.id+', pwd:'+self.pwd+', name:'+self.name+', email:'+self.email

     

     

    잘 구동되는 것을 확인했다 유후

Designed by Tistory.