Dev./Python

Python - Mini project : Library Management System 2

Ivan'show 2023. 7. 19.
728x90
반응형

요구사항 분석

  • 장고 사용금지, 콘솔에서 동작하는 프로그램
  • 프로그램을 실행하면 → 파이썬 파일을 실행시킨다 → 사용자가 입력하는 대로 서비스 기능들에 접근해서 원하는 해당 기능을 요구 조건에 맞게 사용 가능 → 조건에 따라 실행기능들이 동작해야함
  • DB 는 postgresql 을 사용한다 → 설치후에 DB 를 생성해두고 파이썬 프로그램이 실행되면 연결 해주는 작업을 해야한다
  • 실행중에 유저가 DB 에 접근하는 작업을 할 때마다 ORM 을 쓰든 직접 SQL 문을 실행시키든 DB 에 정보를 저장해야한다.

 

postgreSQL 설치

서비스 확인하기

brew services list

postgres 가 없다면, 설치하기

brew install postgresql@15

brew 에서 서비스 시작하기

brew services restart postgresql@15

PATH 에 명령어 등록하기

export PATH="/Applications/Postgres.app/Contents/Versions/latest/bin:${PATH}"

version check

postgres -V

postgres --version
# 아무리 해도 계속 커맨드를 찾을 수 없다고 뜰 경우, 직접 경로를 등록하는 방법이 있다.
# psql 은 설치 되었으나 PATH 설정이 안되는 경우, psql 의 경로를 직접 등록해주자

% vim ~/.zshrc

# 페이지가 열리면 i 를 입력해서 인서트 화면으로 들어가서

export PATH="조회해서 나온 해당 파일의 경로를 입력"

# esc 를 눌러서 편집에서 빠져나온 후

% :wq # 저장 후 종료

사용할 DB 생성

우선 psql 명령어를 사용하여 postgres 에 연결해보자

# psql -h {호스트명} -p {포트 번호} -U {사용자명} -d {데이터베이스명}
psql -h localhost -U kim -p 5432 -d postgres

# psql 로 들어가게 되면 콘솔창이 아래와 같이 변하게 된다.
postgres=#

# psql 종료는
postgres=# \\q

PostgreSQL | psql을 사용하여 PostgreSQL에 연결 | PostgreSQL 연결과 해제

[PostgreSQL] 기본 명령어

바로 요구조건에 맞게 SQL 문을 작성하자

<aside> 💡 psql 에서 백슬래쉬를 사용하여 명령어를 입력하니 잘 확인하고 사용하자

</aside>

\\list -> 데이터 베이스 리스트 확인

postgres=# \\list
List of databases
   Name    |    Owner    | Encoding | Collate | Ctype | ICU Locale | Locale Provider |      Access privileges      
-----------+-------------+----------+---------+-------+------------+-----------------+-----------------------------
 library   | kim | UTF8     | C       | C     |            | libc            | 
 postgres  | kim | UTF8     | C       | C     |            | libc            | 
 template0 | kim | UTF8     | C       | C     |            | libc            | =c/kim             +
           |             |          |         |       |            |                 | kim=CTc/kim
 template1 | kim | UTF8     | C       | C     |            | libc            | =c/kim             +
           |             |          |         |       |            |                 | kim=CTc/kim
(4 rows)

원하는 DB 를 생성하고 접근하기

postgres=# create database library;
CREATE DATABASE

# \\c 명령어로 생성한 DB 로 연결 변경

postgres=# \\c library 
You are now connected to database "library" as user "kim".

# 콘솔에 DB 이름이 바뀐 것을 확인
library=#

요구사항에 적힌대로 해당 DB 에 테이블을 생성하자

# books
CREATE TABLE books (
    book_id INTEGER PRIMARY KEY,
    title VARCHAR(100) NOT NULL,
    author VARCHAR(50) NOT NULL,
    publisher VARCHAR(50) NOT NULL,
    is_available BOOLEAN NOT NULL DEFAULT TRUE
);

# loans
CREATE TABLE loans (
    loan_id INTEGER PRIMARY KEY,
    book_id INTEGER NOT NULL REFERENCES books(book_id),
    loan_date DATE NOT NULL,
    return_date DATE
);

# 테이블을 생성했으면 \\dt 로 릴레이션(테이블)을 확인해 보자
library=# \\dt
          List of relations
 Schema | Name  | Type  |    Owner    
--------+-------+-------+-------------
 public | books | table | kim
 public | loans | table | kim
(2 rows)

# \\d 명령어로 테이블을 세세하게 살펴 볼 수 있다.
library=# \\d books
                          Table "public.books"
    Column    |          Type          | Collation | Nullable | Default 
--------------+------------------------+-----------+----------+---------
 book_id      | integer                |           | not null | 
 title        | character varying(100) |           | not null | 
 author       | character varying(50)  |           | not null | 
 publisher    | character varying(50)  |           | not null | 
 is_available | boolean                |           | not null | true
Indexes:
    "books_pkey" PRIMARY KEY, btree (book_id)
Referenced by:
    TABLE "loans" CONSTRAINT "loans_book_id_fkey" FOREIGN KEY (book_id) REFERENCES books(book_id)

library=# \\d loans
                  Table "public.loans"
   Column    |  Type   | Collation | Nullable | Default 
-------------+---------+-----------+----------+---------
 loan_id     | integer |           | not null | 
 book_id     | integer |           | not null | 
 loan_date   | date    |           | not null | 
 return_date | date    |           |          | 
Indexes:
    "loans_pkey" PRIMARY KEY, btree (loan_id)
Foreign-key constraints:
    "loans_book_id_fkey" FOREIGN KEY (book_id) REFERENCES books(book_id)

library=#

 

 

파이썬 코드 작성

우선 psycopg2 에 대해서 알 필요가 있어보인다.

파이썬 DB 커넥터(psycopg2) 간단한 사용법/executor과 commit 차이

postgresql 을 사용할 때 데이터 베이스에 연결하기 위해 사용하는 커넥터라고 한다.

# psycopg2 안에 있는 connect 메서드를 사용해서 기본 정보들을 입력후 연결시키는 것으로 보인다.
conn = psycopg2.connect(host=host, user=user, password=password,
                        dbname=database, port=port)

# conn 안에 있는 cursor 메서드가 실직적으로 DB 에 쿼리문을 수행하고 결과를 가져온다.
cursor = conn.cursor()

# 쿼리문을 조작하는 예시
cursor.execute("CREATE TABLE User(Name text, PhoneNum text);")
conn.commit() # commit() 을 실행해서 실제로 데이터 베이스에 반영

# 트랜잭션이 모두 종료되었다면 반드시 연결을 끊어 리소스 낭비를 줄인다.
cursor.close()
conn.close()

psycopg2 를 설치하려 했으나 애플실리콘이라 그런지 어쩐지 정확히는 모르겠지만 설치가 되지 않았다. 구글에서 찾아보니 아래의 라이브러리로 해당 기능을 사용할 수 있다고 했다.

pip install psycopg2-binary

막상 작성하려고하니 개인정보값들이 들어가서 이를 어떻게 할까 고민하다가 환경변수로 해당 정보를 핸들링하고 gitignore 로 로컬에서만 사용하게 지정했다.

pip install python-dotenv

.env 파일을 루트 파일에 만들어주고 커넥션에 사용할 정보들을 넣어준다

# .env 파일
DATABASE_HOST=DB 설정때 사용한 주소
DATABASE_USER=DB 설정때 사용한 유저이름
DATABASE_PASSWORD=DB 설정때 사용한 비밀번호
DATABASE_NAME=DB 설정때 사용한 데이터베이스 이름
DATABASE_PORT=DB 설정때 사용한 포트번호
# 파이썬 파일에서 가져다 쓰기
import os
from dotenv import load_dotenv

load_dotenv()  # take environment variables from .env

DATABASE_HOST = os.getenv("DATABASE_HOST")
DATABASE_USER = os.getenv("DATABASE_USER")
DATABASE_PASSWORD = os.getenv("DATABASE_PASSWORD")
DATABASE_NAME = os.getenv("DATABASE_NAME")
DATABASE_PORT = os.getenv("DATABASE_PORT")

또한, connection 함수가 실행되면서 DB 에 접근해서 테이블이 제대로 생성 되어 있는지 확인하고 없다면 새로 생성해주는 코드를 넣어서 코드의 안정성과 신뢰성을 높이는게 좋아보인다.

# books 테이블 채크후 없으면 생성
    cursor.execute("""
        CREATE TABLE IF NOT EXISTS books (
            book_id INTEGER PRIMARY KEY,
            title VARCHAR(100) NOT NULL,
            author VARCHAR(50) NOT NULL,
            publisher VARCHAR(50) NOT NULL,
            is_available BOOLEAN NOT NULL DEFAULT TRUE
        );
    """)

    # loans 테이블 채크후 없으면 생성, FOREIGN KEY 체크
    cursor.execute("""
        CREATE TABLE IF NOT EXISTS loans (
            loan_id INTEGER PRIMARY KEY,
            book_id INTEGER,
            loan_date DATE NOT NULL,
            return_date DATE,
            FOREIGN KEY (book_id) REFERENCES books (book_id)
        );
    """)

이제 연결이 잘 되었는지 조회문으로 한번 가져와서 확인하는 작업을 해보자. 우선 psql 로 아래의 문구를 써서 가져올 정보를 하나 만들어보자

INSERT INTO books (book_id, title, author, publisher, is_available) VALUES (1, 'The Great Gatsby', 'F. Scott Fitzgerald', 'Scribner', TRUE);
# 제대로 입력 되었는지 확인하기

library=# SELECT * FROM books;
 book_id |      title       |       author        | publisher | is_available 
---------+------------------+---------------------+-----------+--------------
       1 | The Great Gatsby | F. Scott Fitzgerald | Scribner  | t
(1 row)

library=#

파이썬 코드에서 execute 를 이용해서 조회를 하고, fetchall() 메서드를 이용해서 변수에 저장하고 출력해본다.

[PYTHON/PYSQLITE] Connection 클래스 : commit/rollback 메소드를 사용해 트랜잭션 처리하기

[Python] 파이썬 postgresql 접속 및 select 하기

👍 Python cursor’s fetchall, fetchmany(), fetchone() to read records from database table

cursor.execute("""
    SELECT * FROM books;
    """)

    rows = cursor.fetchall()

    connection.commit()
    cursor.close()
    connection.close()
    print("여기 오나?")
    print(rows)

# (venv) kim@Kim-MacBookPro pythonProject1 % python main.py
# 여기 오나?
# [(1, 'The Great Gatsby', 'F. Scott Fitzgerald', 'Scribner', True)]

파이썬 코드에서 조회해서 결과를 확인 했으니 DB 가 잘 연결되었다고 볼 수 있다.

 

 

main.py 파일이 실행되면 메인 함수가 실행되도록 셋팅

if __name__ == "__main__":
    main()

 

728x90
반응형

댓글