상세 컨텐츠

본문 제목

Step2 - DB(SQLite3) 계속...

본문

반응형

04. while 문 작성

 

프로그램 응답 및 대기 상태를 위해 while 문을 작성한다.

몇 가지 추가될 기능을 포함하여 작성하고, 먼저 출판사 등록이 정상적으로 이뤄지는지 확인해 볼 예정이다.

 

import sqlite3

# DB생성 및 Auto Commit, RollBack
conn = sqlite3.connect(r'.\book_manager_database.db', isolation_level=None) # 해당 경로에 book_manager_database.db DB파일이 생성된다.

# 커서(Cursor)의 이용
global cursor
cursor = conn.cursor()
print('Cursor Tppe : ', type(cursor))    # Cursor Tppe :  




######################################################################
# 테이블 생성(Data Type : TEXT, NUMERIC INTEGER, REAL, BLOB)

# 도서 기준(출판사)
cursor.execute('CREATE TABLE IF NOT EXISTS publisher(pub_id integer primary key autoincrement, publisher_name text unique, \
    email text, tel_no text, website text, address text)')


# 출판사 등록 함수
def register_publisher(publisher_name, email, tel_no, website, address):
    cursor.execute(r"insert into publisher (publisher_name, email, tel_no, website, address) values('{}','{}','{}','{}','{}')".format(publisher_name, email, tel_no, website, address));




while True :
    print('#################################################')
    print('▼ 출판사 등록 : 1\n▼ 도서 등록 : 2\n▼ 도서 검색 및 대여 : 3\n▼ 출판사 검색 : 7\n▼ 프로그램 종료 : 0')

    input_command= input("수행하실 동작을 입력하세요.  : ")

    if input_command == '1': # 출판사 등록
        publisher_company_name = input('출판사 명을 입력하세요. : ')
        publisher_company_email = input('출판사의 메일주소를 입력하세요. : ')
        publisher_company_tel = input('출판사의 전화번호를 입력하세요. : ')
        publisher_company_site = input('출판사의 Web Site 주소를 입력하세요. : ')
        publisher_company_address = input('출판사의 주소를 입력하세요. : ')

        register_publisher(publisher_company_name, publisher_company_email, publisher_company_tel, publisher_company_site, publisher_company_address)
    

    elif input_command == '2': # 도서 등록
        pass
        
    elif input_command == '3': # 도서 검색 및 대여
        pass

    elif input_command =='7': # 출판사 검색
        pass

    elif input_command == '0':
        print('\n프로그램을 종료합니다.\n\n')
        break
    else:
        print('\n\n잘못된 입력입니다. 항목을 다시 선택하세요.\n')

 

Error 메세지는 나타나지 않는데.... 등록이 정상적으로 진행되었는지 확인이 필요할 것 같다....

급하게 출판사 검색 함수를 작성....

 

# 출판사 검색 함수
def select_publisher(company_name):

    # 출판사 결과 리스트 초기화
    global result_rows
    result_rows =[]
    
    if company_name == '':
        cursor.execute("select * from publisher");
        

    else:
        cursor.execute(r"select * from publisher where publisher_name like '{}'".format(company_name));
        
    result_rows = cursor.fetchall()
        
    #print(len(result_rows))
    #print(type(result_rows))
    
    for r in result_rows:
        print(r)

출판사 검색 함수는 사용자에게서 출판사명을 먼저 전달 받아 확인하는 함수로 만들었다.

이후, 도서 등록 등에도 사용이 필요할 것 같아 전역 변수로 설정하였고,

빈 값이 입력되면, 등록된 전체 출판사 리스트를 출력하고, 특정 값이 입력되면 검색 후, 검색 결과 값을 반환한다.

출판사 검색 시, wildcard 를 사용해야 할지 고민을 잠깐해보았다....

wildcards 는 전체가 아닌 일부를 알고 있을 때 검색을 도와줄 수 있는 기능이다.

종류로는 '%' 와 '_' 가 있는데 각각 기능의 차이를 보면

 

 % : 길이와는 상관없이 해당 항목을 표시

 _ : 1개의 문자열을 표시

 

할 수 있다. 

반응형

 

 

만약 출판사 정보가 아래와 같이 등록되어 있다면,

검색 조건(where 절) 검색 결과 이유
publisher_name = 'abc' 0 건  완전히 일치하는 항목이 없음
publisher_name = 'abc출판' 1 건 (No 1) 완전히 일치하는 항목만 출력
publisher_name like '%b%출판' 2 건 (No 1, 4) 길이에 상관없이 출판사명에 b를 포함한 항목이 출력 
publisher_name like '_b_출판' 1 건(No 1) '_' 의 경우 1개의 문자열만을 표시하므로, abcd출판은 자릿수가 맞지 않음.

표와 같은 형태로 검색 결과가 나타나게된다.

 

일반 사용자의 경우, 도서명을 검색하는 경우는 있으나, 출판사명을 검색할 일은 거의 없을 거라는 생각이 들어

관리자가 정확한 업무를 진행하기 위해 출판사의 검색은 wildcards 를 제거하였다.

 

 

그리고, 관리자와 일반 사용자의 로그인이 먼저 진행되어야 할 것 같은 생각이 들어..

다시 로그인 과정을 생성하였다...

 

이런 갑작스러운 번복 및 실수를 피하기 위해서 사전 기획이 중요하다...... 

 

로그인 과정은 다음 글에...

 

 

출판사 검색 까지 등록된 전체 코드

import sqlite3

# DB생성 및 Auto Commit, RollBack
conn = sqlite3.connect(r'.\book_manager_database.db', isolation_level=None) # 해당 경로에 book_manager_database.db DB파일이 생성된다.

# 커서(Cursor)의 이용
global cursor
cursor = conn.cursor()
print('Cursor Tppe : ', type(cursor))    # Cursor Tppe :  




######################################################################
# 테이블 생성(Data Type : TEXT, NUMERIC INTEGER, REAL, BLOB)

# 도서 기준(출판사)
cursor.execute('CREATE TABLE IF NOT EXISTS publisher(pub_id integer primary key autoincrement, publisher_name text unique, \
    email text, tel_no text, website text, address text)')


# 출판사 등록 함수
def register_publisher(publisher_name, email, tel_no, website, address):
    cursor.execute(r"insert into publisher (publisher_name, email, tel_no, website, address) values('{}','{}','{}','{}','{}')".format(publisher_name, email, tel_no, website, address));


# 출판사 검색 함수
def select_publisher(company_name):

    # 출판사 결과 리스트 초기화
    global result_rows
    result_rows =[]
    
    if company_name == '':
        cursor.execute("select * from publisher");
        

    else:
        cursor.execute(r"select * from publisher where publisher_name like '{}'".format(company_name));
        
    result_rows = cursor.fetchall()
        
    #print(len(result_rows))
    #print(type(result_rows))
    
    for r in result_rows:
        print(r)



while True :
    print('#################################################')
    print('▼ 출판사 등록 : 1\n▼ 도서 등록 : 2\n▼ 도서 검색 및 대여 : 3\n▼ 출판사 검색 : 7\n▼ 프로그램 종료 : 0')

    input_command= input("수행하실 동작을 입력하세요.  : ")

    if input_command == '1': # 출판사 등록
        publisher_company_name = input('출판사 명을 입력하세요. : ')
        publisher_company_email = input('출판사의 메일주소를 입력하세요. : ')
        publisher_company_tel = input('출판사의 전화번호를 입력하세요. : ')
        publisher_company_site = input('출판사의 Web Site 주소를 입력하세요. : ')
        publisher_company_address = input('출판사의 주소를 입력하세요. : ')

        register_publisher(publisher_company_name, publisher_company_email, publisher_company_tel, publisher_company_site, publisher_company_address)
    

    elif input_command == '2': # 도서 등록
        pass
        
    elif input_command == '3': # 도서 검색 및 대여
        pass

    elif input_command =='7': # 출판사 검색
        company_name = input('출판사명을 입력하세요. \n※ 빈칸 입력 시, 전체 검색 : ')

        select_publisher(company_name)

    elif input_command == '0':
        print('\n프로그램을 종료합니다.\n\n')
        break
    else:
        print('\n\n잘못된 입력입니다. 항목을 다시 선택하세요.\n')
반응형

관련글 더보기

댓글 영역