SQLAlchemy 설정 및 개념 이해하기
SQLAlchemy는 Python 프로그래밍 언어에서 데이터베이스와의 연결 및 Object-Relational Mapping(ORM)을 지원하는 강력한 라이브러리입니다. 이 글에서는 SQLAlchemy의 기본 개념과 설정 방법에 대해 자세히 설명하며, 비동기 처리를 위한 SQLAlchemy의 활용 방법에 대해서도 살펴보겠습니다.
데이터베이스와의 효과적인 상호작용을 통해 웹 애플리케이션의 성능을 높일 수 있는 방법을 알아보겠습니다.
SQLAlchemy 개요
SQLAlchemy는 데이터베이스와의 인터페이스를 단순화하여 SQL 구문을 Python 코드로 작성할 수 있도록 도와줍니다. 기본적으로 두 가지 주요 구성 요소로 나눌 수 있습니다.
Core와 ORM입니다. Core는 SQLAlchemy의 저수준 SQL 표현 및 데이터베이스와의 상호작용을 처리하며, ORM은 데이터베이스의 테이블을 Python 클래스와 연결하여 객체 지향적으로 데이터베이스 작업을 수행할 수 있게 해줍니다.
SQLAlchemy Core와 ORM
구성 요소 | 설명 |
---|---|
Core | SQLAlchemy의 저수준 SQL 표현 및 DB 연결 |
ORM | Python 클래스를 통해 데이터베이스와 상호작용 |
SQLAlchemy를 사용할 때, Core를 먼저 알아보는 것이 필요합니다. Core는 SQLAlchemy의 기반이 되는 부분으로, 데이터베이스와의 연결, 쿼리 생성 및 실행, 트랜잭션 관리 등을 포함합니다.
ORM은 Core 위에 구축되어 데이터베이스 테이블을 Python 객체로 매핑하여 더 직관적인 데이터 조작이 가능하게 합니다. 다른 내용도 보러가기 #1
SQLAlchemy 설치 및 기본 설정
SQLAlchemy를 사용하기 위해서는 먼저 패키지를 설치해야 합니다. 아래의 명령어를 통해 SQLAlchemy와 함께 사용할 데이터베이스 드라이버를 설치할 수 있습니다.
pip install sqlalchemy asyncpg
위의 명령어는 SQLAlchemy와 PostgreSQL 데이터베이스에 연결하기 위한 asyncpg
드라이버를 설치합니다. 다른 데이터베이스를 사용할 경우 해당 데이터베이스에 맞는 드라이버를 선택하여 설치하시면 됩니다.
설치가 완료되면, 기본적인 데이터베이스 연결 설정을 진행해야 합니다. 예를 들어, PostgreSQL 데이터베이스에 연결하기 위한 코드는 다음과 같습니다.
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker
DATABASE_URL = "postgresql+asyncpg://user:password@localhost/dbname"
engine = create_async_engine(DATABASE_URL, echo=True)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine, class_=AsyncSession)
위 코드에서 create_async_engine
함수를 사용하여 비동기 엔진을 생성하고, sessionmaker
를 통해 데이터베이스 세션을 관리합니다. 이 설정을 통해 SQLAlchemy를 사용한 비동기 데이터베이스 작업이 가능해집니다.
SQLAlchemy의 비동기 처리
SQLAlchemy 1.4 버전부터 비동기 처리 기능이 추가되었습니다. 비동기 처리를 통해 데이터베이스와의 연결을 비동기로 관리할 수 있으며, 이는 웹 애플리케이션의 성능을 크게 향상시킬 수 있는 요소입니다.
비동기 처리는 특히 FastAPI와 같은 비동기 웹 프레임워크와 함께 사용할 때 유용합니다.
비동기 쿼리 실행의 예
비동기 쿼리를 실행하기 위해서는 async
와 await
키워드를 사용하여 비동기 함수 내에서 SQLAlchemy의 비동기 메소드를 호출해야 합니다. 예를 들어, 특정 테이블에서 데이터를 비동기로 조회하는 코드는 다음과 같이 작성할 수 있습니다.
from sqlalchemy.future import select
from sqlalchemy.ext.asyncio import AsyncSession
async def get_user(db: AsyncSession, user_id: int):
async with db.begin():
result = await db.execute(select(User).where(User.id == user_id))
return result.scalars().first()
위의 예제에서는 AsyncSession
을 사용하여 데이터베이스 세션을 관리하고, 비동기적으로 select
쿼리를 실행합니다. await
키워드를 사용하여 쿼리 실행이 완료될 때까지 기다리며, 결과를 반환합니다.
비동기 처리 | 설명 |
---|---|
async | 비동기 함수 정의 |
await | 비동기 작업을 기다림 |
SQLAlchemy ORM을 활용한 데이터베이스 작업
ORM을 활용하면 데이터베이스 작업을 객체 지향적으로 수행할 수 있습니다. SQLAlchemy의 ORM은 데이터베이스 테이블을 Python 클래스와 매핑하여, SQL 쿼리를 작성하지 않고도 데이터베이스 작업을 수행할 수 있게 해줍니다.
예를 들어, 사용자 정보를 저장하는 User 모델을 정의하고, 이를 통해 사용자 데이터를 추가하거나 조회하는 코드를 작성할 수 있습니다.
User 모델 정의
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, index=True)
name = Column(String, index=True)
email = Column(String, unique=True, index=True)
위의 코드에서 User 클래스는 데이터베이스의 users 테이블에 매핑됩니다. 각 속성은 테이블의 컬럼을 나타내며, 데이터베이스 구조를 Python 클래스 형태로 표현합니다.
CRUD 작업 구현
이제 CRUD(Create, Read, Update, Delete) 작업을 수행하는 함수를 작성해보겠습니다.
async def create_user(db: AsyncSession, user: User):
db.add(user)
await db.commit()
await db.refresh(user)
return user
위의 create_user
함수는 새로운 사용자를 데이터베이스에 추가하는 비동기 함수입니다. db.add(user)
로 사용자를 추가한 후, await db.commit()
을 통해 변경 사항을 저장합니다.
await db.refresh(user)
는 데이터베이스의 상태를 최신 상태로 갱신하는 역할을 합니다.
CRUD 작업 | 설명 |
---|---|
Create | 새로운 데이터 추가 |
Read | 데이터 조회 |
Update | 기존 데이터 수정 |
Delete | 데이터 삭제 |
결론
SQLAlchemy는 Python에서 데이터베이스 작업을 간편하게 처리할 수 있게 해주는 강력한 도구입니다. 비동기 처리를 지원함으로써 웹 애플리케이션의 성능을 더욱 향상시킬 수 있습니다.
FastAPI와 함께 사용하면 비동기 API를 구현하는 데 큰 도움이 됩니다. 데이터베이스와의 효율적인 상호작용을 위해 SQLAlchemy의 Core와 ORM을 충분히 알아보고 활용하면, 보다 세련된 웹 애플리케이션을 개발할 수 있을 것입니다.
SQLAlchemy를 통해 데이터베이스와의 연결을 효율적으로 관리하고, 비동기 처리를 통해 애플리케이션의 성능을 극대화해 보시기 바랍니다.
댓글
댓글 쓰기