집돌이 공대남 IT

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

IT/파이썬

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

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

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

 

오늘은 ORM에 대해서 배워보도록 하겠습니다. 

 

1. ORM의 정의

 

ORM(객체 관계 매핑)은 객체와 관계형 데이터베이스 사이의 매핑을 처리하는 기술로, 데이터베이스에서 가져온 데이터를

객체로 변환하고, 객체에서 데이터베이스에 저장된 데이터를 변환하는 작업을 자동으로 처리해줍니다.

 

ORM을 사용하면 SQL 질의를 직접 작성하지 않아도 되므로, 개발자가 객체 모델에만 집중할 수 있게 되어 개발 생산성이

향상됩니다. 또한, ORM을 사용하면 데이터베이스의 종류나 스키마 변경 시에도 애플리케이션 코드를 수정하지 않아도

됩니다.

 

대표적인 파이썬 ORM으로는 Django ORM, SQLAlchemy 등이 있습니다.

 

Django ORM은 Django 프레임워크와 함께 제공되는 ORM으로, 간편하게 데이터베이스를 조작할 수 있는 인터페이스를

제공합니다. Django ORM은 데이터베이스 스키마를 자동으로 생성해주는 기능을 가지고 있어 개발 생산성이 높습니다.

 

SQLAlchemy는 Django ORM과 달리 데이터베이스 연결에 대한 설정을 직접해야 하지만, 데이터베이스 연결 설정에 대한 유연성이 높습니다. SQLAlchemy는 객체지향적인 인터페이스를 제공하며, 데이터베이스 연결 객체를 생성한 후에는 SQL 질의를 처리할 수 있습니다.

 

 

2. ORM 초기 설정

1. ORM 라이브러리 설치

먼저 ORM 라이브러리를 설치해야 합니다. 파이썬에서 가장 많이 사용되는 ORM 라이브러리는 Django ORM, SQLAlchemy 등이 있습니다.

 

이 중에서도 Django ORM은 Django 프레임워크와 함께 제공되므로 설치가 필요하지 않습니다. 만약 SQLAlchemy를 사용하고 싶다면 pip 명령어를 이용하여 설치할 수 있습니다.

pip install sqlalchemy​
 
 
2. 데이터베이스 연결 설정

ORM을 사용하려면 데이터베이스와의 연결 설정이 필요합니다. SQLAlchemy의 경우, create_engine() 함수를 사용하여 데이터베이스에 연결할 수 있습니다. 예를 들어 MySQL 데이터베이스에 연결하려면 다음과 같이 작성합니다.

from sqlalchemy import create_engine

engine = create_engine('mysql+pymysql://<username>:<password>@<host>/<dbname>')

위 코드에서 <username>, <password>, <host>, <dbname> 부분은 각각 사용자 이름, 비밀번호, 호스트 이름, 데이터베이스 이름으로 대체되어야 합니다.

또한, 위 코드에서는 pymysql 모듈을 사용하여 MySQL 데이터베이스에 연결하도록 작성되었습니다.

 

3. 모델 클래스 작성

ORM을 사용하기 위해서는 모델 클래스를 작성해야 합니다. 모델 클래스는 데이터베이스의 테이블과 매핑되는 클래스로, 클래스 내에는 데이터베이스 테이블의 각 컬럼에 해당하는 필드가 선언되어 있습니다.

SQLAlchemy의 경우, declarative_base() 함수를 이용하여 모델 클래스의 베이스 클래스를 정의하고, 이를 상속받아 모델 클래스를 작성합니다.

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)
    age = Column(Integer)

위 코드에서 User 클래스는 데이터베이스의 users 테이블과 매핑되는 모델 클래스입니다.

id, name, age 필드는 각각 users 테이블의 id, name, age 컬럼과 매핑됩니다.

 

4. 데이터베이스 연결과 세션 생성

모델 클래스가 작성되면, 이를 이용하여 데이터베이스 연결을 생성하고 세션을 생성합니다.

SQLAlchemy의 경우, create_all() 함수를 사용하여 모델 클래스에 정의된 테이블을 생성하고, sessionmaker() 함수를 사용하여 세션 객체를 생성합니다.

from sqlalchemy.orm import sessionmaker

Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()

 

3. ORM 사용방법

ORM을 사용하는 방법은 크게 3단계로 나눌 수 있습니다.

  1. 모델 정의하기
  2. ORM을 통한 데이터 조작하기
  3. 데이터베이스에 반영하기

1. 모델 정의하기

먼저 ORM을 사용하기 위해서는 데이터베이스의 테이블과 매칭되는 모델을 정의해야 합니다. 일반적으로는 모델 클래스를 만들고 그 클래스의 속성을 통해 각각의 열(column)을 정의합니다. 이때 각각의 속성은 데이터베이스의 컬럼과 매칭됩니다.

from sqlalchemy import Column, Integer, String

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

위 코드는 User 클래스를 정의하고 id, name, age 속성을 통해 데이터베이스의 users 테이블과 매칭시킨 예시입니다. __tablename__ 속성은 모델 클래스가 매핑할 데이터베이스의 테이블 이름을 지정합니다.

2. ORM을 통한 데이터 조작하기

모델을 정의한 후에는 ORM을 통해 데이터를 조회, 추가, 수정, 삭제할 수 있습니다. SQLAlchemy를 사용하는 경우, 데이터베이스에 접근하려면 Session 객체를 만들어야 합니다.

from sqlalchemy.orm import Session

session = Session()​

2-1. 데이터 조회하기

# 모든 데이터 조회하기
users = session.query(User).all()

# 조건에 맞는 데이터 조회하기
user = session.query(User).filter_by(name='John').first()

2-2. 데이터 추가하기

user = User(name='Jane', age=25)
session.add(user)
session.commit()

2-3. 데이터 수정하기

user = session.query(User).filter_by(name='Jane').first()
user.age = 30
session.commit()

2-4. 데이터 삭제하기

user = session.query(User).filter_by(name='Jane').first()
session.delete(user)
session.commit()

3. 데이터베이스에 반영하기

ORM을 통해 추가, 수정, 삭제한 데이터는 Session 객체를 통해 데이터베이스에 반영할 수 있습니다.

session.commit()

또한, 모델 클래스의 변경 사항을 데이터베이스에 반영하려면 create_all() 메서드를 사용합니다.

Base.metadata.create_all(engine)

위 코드는 Base 클래스에 정의된 모든 테이블을 데이터베이스에 생성합니다. engine은 데이터베이스와의 연결을 설정한 객체입니다.