SQLAlchemy 사용하기

snooby·2022년 8월 19일
5

⚒ Python

목록 보기
7/14
post-thumbnail

ORM

ORM이란 객체 관계 매핑(Object Relational Mapping)으로 데이터베이스 내의 테이블들을 객체화하여 각 DBMS에 대해서 CRUD 등을 공통된 접근 기법으로 사용할 수 있습ㄴ디ㅏ.

하나의 객체를 다루기 위해 여러 SQL 쿼리가 사용되기에 프로그램이 커지면 작성해야하는 SQL 쿼리 또한 많아집니다.
반복되는 쿼리를 객체 단위로 생성해서 이를 해결하고자 탄생한 것이 ORM입니다.

ORM을 사용하게 되면 따로 SQL문을 작성할 필요없이 객체를 통해 간접적으로 데이터베이스를 조작할 수 있습니다.

이러한 ORM의 대표적인 예시가 Python ORM, SQLAlchemy 등이 있습니다.

장점

  1. 개발 생산성 증가
  2. 유지보수 편리
    데이터 구조 변경이 일어날 시, 객체에 대한 변경만 이루어지면 되므로 유지보수가 편리해집니다.
  3. 코드 가독성 상승

단점

  1. 호출방식에 따라 성능이 크게 차이가 있음
  2. 복잡한 쿼리 작성 시, ORM에 대한 난이도 증가
  3. DBMS 고유 기능 모두 사용하지 못함.

SQL Query vs ORM

  • SQL Query
INSERT INTO TABLE(COL1,COL2) VALUES(VAL1, VAL2);
  • ORM
user = User(name='kim', nickname='kimm')
db.session.add(user)

SQLAlchemy

파이썬 ORM 라이브러리에서 가장 많이 사용되는 패키지입니다.
SQLAlchemy는 파이썬 코드에서 DB와 연결하기 위해 사용되빈다.
SQLAlchemy는 DB 테이블을 프로그래밍 언어의 클래스로 표현해주고 테이블의 CRUD를 돕습니다.

SQLAlchemy를 쓰는 이유

SQLAlchemy를 사용하면 sql 쿼리를 작성하지 않아도 프로그램이 언어로 객체간의 관계를 표현해 줍니다. 따라서, SQLAlchemy로 model을 정의하고 정의한 모델을 테이블과 mapping할 수 있는 여러가지 방법을 쉽게 구현할 수 있습니다.
따라서,

  • DB 종류와 상관없이 일관된 코드를 유지할 수 있고
  • 유지 보수가 편리하고
  • SQL쿼리를 내부에서 자동으로 생성해주므로 쿼리 오류 문제도 발생하지 않습니다.

SQLAlchemy 사용하기

SQLAlchemy를 사용하여 언어로 db 작업을 하기 위해서는 우선 db를 생성해보겠습니다.

1. DB 생성

저는 PostgresSql을 사용하여 db를 생성했습니다.
Docker에서 이미지로 생성했으며 생성을 쉽게 하기위해 Makefile로 실행문을 파일생성하였습니다.

run-db:
	docker run --name docker명 -p 5432:5432 -e POSTGRES_PASSWORD=비번 -e POSTGRES_DB=db명 -v ${PWD}/db_data:/var/lib/postgresql/data -d postgres:14.1

Docker에서 image를 사용하여 PostgresSQL 생성하는 것에 대하여 자세히 알고 싶으신 분의 여기에 자세히 작성해 두었으니 도움되시기 바랍니다.

2. DB 연결

이렇게 생성한 db를 사용하기 위해 연결해보겠습니다.
우선 sqlalchemy 패키지를 사용해야하므로 설치합니다.

pip install sqlalchemy

database.py 파일에 db 연결 소스를 작성하겠습니다.

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

# 연결할 db url
SQLALCHEMY_DATABASE_URL = "postgresql://db명:비번@localhost/docker명"

engine = create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()

def get_db():
    db = SessionLocal()
    try:
        yield db
    except:
        db.close()

create_engine 를 사용해 우리의 db와 연결가능한 engine을 생성했습니다.
그리고, 접속이 끝나더라도 계속해서 연결 상태를 유지시키기 위해 sessionmaker를 통해 세션을 생성합니다.
새로운 tabler과 mapper를 만들기 위한 declarative_base()를 호출하여 Base를 생성하였습니다.
이제 이렇게 저희 DB를 만들고 연결, 세션 정보를 생성해 보았습니다. 이제 이것을 가지고 model을 매핑하는 스크립트를 작성해보겠습니다.

3. model 생성

models.py

from sqlalchemy import Integer, String, DateTime, Bool
from sqlalchemy.sql.schema import Column
from .database import Base
from pydantic import BaseModel

class Job(Base):
    __tablename__ = 'jobs'

    id = Column(Integer, primary_key=True)
    title = Column(String, nullable=False)
    description = Column(String, nullable=False)

우리가 앞서 생성한 Base를 가져와 (from .database import Base) model을 매핑해봅니다.
테이블명은 jobs, 각 칼럼은 id, title, description으로 생성해줍니다.

이렇게 우리가 생성할 테이블명과 그 테이블의 요소(칼럼) 등을 정의했고 이것을 실행시켜 실제 db에 데이터를 생성하기 위해서는 alembic이라는 데이터베이스 마이그레이션 도구를 사용할 것입니다.

길이 길어질 수 있으니 다음 글에서 alembic 설명과 이어 설명해보겠습니다.

profile
데이터를 가치있게 다루고 싶은 개발자 🐥

0개의 댓글