요구사항 분석
- 장고 사용금지, 콘솔에서 동작하는 프로그램
- 프로그램을 실행하면 → 파이썬 파일을 실행시킨다 → 사용자가 입력하는 대로 서비스 기능들에 접근해서 원하는 해당 기능을 요구 조건에 맞게 사용 가능 → 조건에 따라 실행기능들이 동작해야함
- 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 연결과 해제
바로 요구조건에 맞게 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()
'Dev. > Python' 카테고리의 다른 글
Python - Mini project : Library Management System 4 (0) | 2023.07.20 |
---|---|
Python - Mini project : Library Management System 3 (0) | 2023.07.20 |
Python - Mini project : Library Management System 1 (0) | 2023.07.19 |
Python - 배열 (1) | 2023.06.13 |
Python - 패키지 (0) | 2023.06.12 |
댓글