집돌이 공대남 IT

[Python]ORM을 이용한 파이썬 실습(게시판 구현) 본문

IT/파이썬

[Python]ORM을 이용한 파이썬 실습(게시판 구현)

집공이 2023. 3. 5. 22:37

안녕하십니까 집공이 입니다.

 

오늘은 저번 포스팅에서 다뤘던 ORM에 대해서 실습을 해보려고 합니다. 

 

뭔가 내용이 기초만 다뤘던거 같아 오늘은 실습에 대해서 적어보도록 하겠습니다.

 

혹시 저번 포스팅을 참고 하시고 싶으시면 밑에 링크를 참조하시길 바랍니다.

 

 

[Python]파이썬에서 ORM 활용하기

안녕하십니까 집공이입니다. 오늘은 ORM에 대해서 배워보도록 하겠습니다. 1. ORM의 정의 ORM(객체 관계 매핑)은 객체와 관계형 데이터베이스 사이의 매핑을 처리하는 기술로, 데이터베이스에서 가

gongdeanam-it.tistory.com

 

1. 실습

ORM을 실습해보기 위해서는 먼저 사용할 ORM 라이브러리를 선택해야 합니다.

 

파이썬에서 가장 대표적인 ORM 라이브러리는 SQLAlchemy입니다. SQLAlchemy를 이용해 ORM을 실습해보도록 하겠습니다.

 

먼저, SQLAlchemy를 설치합니다. 다음과 같이 명령어를 입력합니다.

!pip install sqlalchemy​

그리고 MySQL 데이터베이스를 이용하여 ORM 실습을 해보겠습니다.

 

MySQL 데이터베이스에 접속하기 위해서는 MySQL 서버와 연결할 수 있는 드라이버가 필요합니다.

이를 위해 pymysql 라이브러리를 설치합니다.

!pip install pymysql​

 

이제 MySQL 데이터베이스에 연결하여 ORM을 실습해보겠습니다.

SQLAlchemy에서는 데이터베이스와 연결하는 작업을 create_engine() 함수를 이용하여 처리합니다.

from sqlalchemy import create_engine

engine = create_engine("mysql+pymysql://[username]:[password]@[host]/[database_name]", echo=True)

여기서 [username], [password], [host], [database_name] 부분은 사용자가 자신이 접속하려는 MySQL 데이터베이스의 정보로 변경해주어야 합니다.

 

이제 ORM을 실습해보겠습니다. 예제로 사용할 테이블을 다음과 같이 정의합니다.

from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String(50))
    age = Column(Integer)

위 코드에서 User 클래스가 테이블을 나타냅니다. 테이블명은 __tablename__ 변수로 정의하며, 테이블의 컬럼은 클래스 내에 정의된 변수로 나타냅니다.

 

이제 ORM을 이용하여 실제로 데이터를 조회하거나 삽입, 수정, 삭제할 수 있습니다.

from sqlalchemy.orm import sessionmaker

Session = sessionmaker(bind=engine)
session = Session()

# 데이터 조회
users = session.query(User).all()
for user in users:
    print(user.id, user.name, user.age)

# 데이터 삽입
user = User(name='Alice', age=25)
session.add(user)
session.commit()

# 데이터 수정
user = session.query(User).filter_by(name='Alice').first()
user.age = 26
session.commit()

# 데이터 삭제
session.delete(user)
session.commit()

위 코드에서는 sessionmaker() 함수를 이용하여 session 객체를 생성합니다.

session 객체를 이용하여 데이터를 조회하거나 삽입, 수정, 삭제할 수 있습니다.

이제 ORM을 실습해보세요!

 

 

잘 따라오셨나요?? 조회나 수정, 삽입, 삭제를 해보면서 본인의 기술로 습득하시길 바랍니다.

 

자 이제 게시판을 ORM으로 구현해볼까요?

 

아래는 게시판을 ORM으로 구현하는 간단한 예시입니다!

 

모델 정의하기

from sqlalchemy import Column, Integer, String, DateTime
from sqlalchemy.sql import func
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Post(Base):
    __tablename__ = 'posts'
    id = Column(Integer, primary_key=True)
    title = Column(String(100), nullable=False)
    content = Column(String(500), nullable=False)
    author = Column(String(20), nullable=False)
    created_at = Column(DateTime, server_default=func.now())

위 코드에서는 SQLAlchemy의 declarative base를 사용하여 Post 모델을 정의하였습니다.

 

Post 모델은 id, title, content, author, created_at 컬럼으로 구성되어 있습니다.

 

데이터베이스에 연결하기

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

engine = create_engine('mysql+pymysql://username:password@host:port/database')
Session = sessionmaker(bind=engine)
session = Session()​

위 코드에서는 create_engine() 함수를 사용하여 MySQL 서버와 연결합니다.

연결할 MySQL 서버의 정보를 입력하면 됩니다.

sessionmaker() 함수를 사용하여 session 객체를 생성합니다.

 

게시물 추가하기

post = Post(title='첫번째 게시글', content='안녕하세요. 첫번째 게시글입니다.', author='홍길동')
session.add(post)
session.commit()

위 코드에서는 Post 모델을 사용하여 게시물 객체를 생성한 후 session.add() 함수를 사용하여

데이터베이스에 추가합니다.

추가한 데이터를 커밋하기 위해 session.commit() 함수를 호출합니다.

 

게시물 조회하기

posts = session.query(Post).all()
for post in posts:
    print(post.id, post.title, post.content, post.author, post.created_at)

위 코드에서는 session.query() 함수를 사용하여 Post 모델을 조회합니다.

 

all() 함수를 사용하여 모든 게시물을 조회하였습니다. 조회한 데이터를 출력합니다.

 

게시물 수정하기

post = session.query(Post).filter_by(id=1).first()
post.title = '수정된 게시글'
post.content = '안녕하세요. 수정된 게시글입니다.'
session.commit()

위 코드에서는 session.query() 함수와 filter_by() 함수를 사용하여 id가 1인 게시물을 조회합니다.

 

조회한 게시물의 title과 content 값을 수정한 후, session.commit() 함수를 호출하여 수정된 데이터를 커밋합니다.

 

게시물 삭제하기

post = session.query(Post).filter_by(id=1).first()
session.delete(post)
session.commit()

위 코드에서는 session.query() 함수와 filter_by() 함수를 사용하여 id가 1인 게시물을 조회합니다. 조회한 게시물을

 

session.delete() 함수를 사용하여 삭제한 후, session.commit() 함수를 호출하여 삭제된 데이터를 커밋합니다.

 

게시판을 구현하기 위해 필요한 데이터베이스 테이블을 만들어야 합니다.

 

일반적으로 게시글, 댓글, 회원 정보 등의 정보가 필요합니다.

 

가장 먼저 게시글 정보를 저장하기 위한 데이터베이스 테이블을 만들어보겠습니다.

 
CREATE TABLE post (
  id INT PRIMARY KEY AUTO_INCREMENT,
  title VARCHAR(100),
  content TEXT,
  author_id INT,
  created_at TIMESTAMP DEFAULT NOW(),
  updated_at TIMESTAMP DEFAULT NOW() ON UPDATE NOW(),
  FOREIGN KEY (author_id) REFERENCES user(id) ON DELETE SET NULL
);

위의 쿼리문을 실행하면 post라는 이름의 테이블이 생성됩니다.

이 테이블은 게시글의 제목, 내용, 작성자 id, 작성 시간, 수정 시간을 저장합니다.

작성자 id는 user 테이블의 id와 연결되어 있으며, 작성자가 삭제된 경우 게시글은 삭제되지 않고 작성자 id는 NULL값으로 설정됩니다.

 

다음으로 댓글 정보를 저장하기 위한 데이터베이스 테이블을 만들어보겠습니다.

CREATE TABLE comment (
  id INT PRIMARY KEY AUTO_INCREMENT,
  post_id INT,
  content TEXT,
  author_id INT,
  created_at TIMESTAMP DEFAULT NOW(),
  updated_at TIMESTAMP DEFAULT NOW() ON UPDATE NOW(),
  FOREIGN KEY (post_id) REFERENCES post(id) ON DELETE CASCADE,
  FOREIGN KEY (author_id) REFERENCES user(id) ON DELETE SET NULL
);

위의 쿼리문을 실행하면 comment라는 이름의 테이블이 생성됩니다.

이 테이블은 댓글의 내용, 게시글 id, 작성자 id, 작성 시간, 수정 시간을 저장합니다.

게시글 id는 post 테이블의 id와 연결되어 있으며, 게시글이 삭제된 경우 해당 게시글에 작성된 댓글도 함께 삭제됩니다.

작성자 id는 user 테이블의 id와 연결되어 있으며, 작성자가 삭제된 경우 댓글은 삭제되지 않고 작성자 id는 NULL값으로 설정됩니다.

 

마지막으로 회원 정보를 저장하기 위한 데이터베이스 테이블을 만들어보겠습니다.

CREATE TABLE user (
  id INT PRIMARY KEY AUTO_INCREMENT,
  email VARCHAR(100),
  password VARCHAR(100),
  name VARCHAR(100),
  created_at TIMESTAMP DEFAULT NOW(),
  updated_at TIMESTAMP DEFAULT NOW() ON UPDATE NOW()
);

위의 쿼리문을 실행하면 user라는 이름의 테이블이 생성됩니다.

 

이 테이블은 회원의 이메일, 비밀번호, 이름, 가입 시간, 수정 시간을 저장합니다.

 

이제 데이터베이스 테이블을 생성했으니, 해당 테이블을 ORM을 이용해 파이썬에서 다루어 보겠습니다.

 

자 이제 ORM을 이용해서 간단한 게시판을 구현해봅시다. 위에 내용을 참고해서 만든것이니 잘 상기해서 실습해보도록

 

합시다.

 

1. 모델 클래스 생성

첫 번째로, 게시판의 글을 저장할 모델 클래스를 생성합니다. 모델 클래스는 데이터베이스의 테이블과 매핑되는 클래스입니다. 예를 들어, 다음과 같은 모델 클래스를 만들 수 있습니다.

from sqlalchemy import Column, Integer, String, Text, DateTime
from sqlalchemy.sql import func
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Post(Base):
    __tablename__ = 'post'

    id = Column(Integer, primary_key=True, autoincrement=True)
    title = Column(String(255), nullable=False)
    content = Column(Text, nullable=False)
    created_at = Column(DateTime(timezone=True), server_default=func.now())

 

2. 데이터베이스 연결

다음으로, 데이터베이스에 연결합니다. 이를 위해서는 SQLAlchemy의 create_engine() 함수를 사용합니다. 이 함수는 데이터베이스의 종류와 위치, 계정 정보 등을 인자로 받습니다.

from sqlalchemy import create_engine

engine = create_engine('mysql+pymysql://username:password@localhost/db_name?charset=utf8', echo=True)
 
 

3. 세션 생성

다음으로, 데이터베이스에서 데이터를 읽고 쓰기 위해 SQLAlchemy의 Session 클래스를 사용합니다. Session 객체는 데이터베이스 연결을 담당하는 engine 객체를 인자로 받습니다.

from sqlalchemy.orm import sessionmaker

Session = sessionmaker(bind=engine)
session = Session()
 
 

4. 데이터 쓰기

모델 클래스와 세션 객체를 사용하여 데이터를 쓰는 방법은 다음과 같습니다.

post = Post(title='제목', content='내용')
session.add(post)
session.commit()
 
 

5. 데이터 읽기

데이터를 읽는 방법은 다음과 같습니다.

posts = session.query(Post).all()
for post in posts:
    print(post.title, post.content)
 
 

6. 데이터 수정

데이터를 수정하는 방법은 다음과 같습니다.

post = session.query(Post).filter_by(id=1).first()
post.title = '새로운 제목'
session.commit()
 
 

7. 데이터 삭제

데이터를 삭제하는 방법은 다음과 같습니다.

post = session.query(Post).filter_by(id=1).first()
session.delete(post)
session.commit()

 

위에서 적었던 내용을 활용하여 ORM을 이용하여 게시판 기능을 구현해보았습니다.

게시판의 세부적인 기능들을 구현하기 위해서는 다양한 추가적인 코드가 필요하겠지만 오늘은 기본적인 게시판의 기능만 구현해보았습니다.

 

어떠신가요? 오늘은 좀 많이 길었네요. 실습 위주라 확실히 글이 길어지네요. 

오늘 내용 확실히 복습하시고 내용 바꿔가면서 공부하시길 바랍니다.

 

감사합니다.