SQLAlchemy 는 파이썬의 ORM 라이브러리 중 하나이다.
이 글에서는 SQLAlchemy 의 Quick Start 내용을 기반으로 SQLAlchemy 의 기본적인 내용들을 기술한다.
1. Database 연결 - Engine
Engine 은 SQLAlchemy 라이브러리의 시작점이다. SQLAlchemy 의 Pool 과 Dialect 기능을 사용하여 실제 Database 에 접근하고 DB API 를 사용할 수 있도록 해준다.
여기서 Pool 은 DB Connection Pool 을 추상화한 클래스로 connect() 를 통해서 DBAPI 연결을 생성한다. Dialect 는 SQLAlchemy 를 여러 종류의 database 와 DB API 들과 연동하여 사용할 수 있도록 하는 역할을 한다. 각 database 와 DB API 에 따른 메타데이터, query 생성, 실행 방식 등등의 정보를 가지고 있다.
Engine 은 create_engine() 함수를 사용하여 생성한다. Engine 의 기본 매개변수는 url 로 해당 url 의 database 와 연결한다. 아래의 예시는 sqlite database 와 연동하고있다.
from sqlalchemy import create_engine
```
- url 형식: dialect+driver://username:password@host:port/database
dialect 를 통해서 사용할 database 를 지정할 수 있는데,
PostgreSQL, MySQL, MariaDB, SLite, Oracle, Microsoft SQL Server 등과의 연동을 제공해준다.
driver 의 경우는 따로 지정하지 않으면 SQLAlchemy 에 기본적으로 지정되어 있는 드라이버를 사용한다
```
DB_URL = 'sqlite:///test.db'
engine = create_engine(DB_URL)
2. Table Mapping - Base
SQLAlchemy 에서는 database 테이블과 클래스의 매핑을 위해서 base 클래스를 생성한다. 이 base 클래스는 declarative_base() 함수를 통해서 생성되는 metaclass 로 해당 클래스를 상속받은 자식 클래스들은 모두 테이블과 매핑되는 클래스로 인식된다.
- 테이블 정의
아래의 예시는 base 클래스를 생성하고 User 클래스가 이를 상속받아 구현되어 있다. User 클래스는 database 의 user 테이블과 매핑된다.
from sqlalchemy.orm import declarative_base
Base = declarative_base()
# Base 를 상속받아서 만들어진 클래스이다.
class User(Base):
__tablename__ = 'user' # user 테이블과 매핑된다.
id = Column(Integer, primary_key=True, unique=True, autoincrement=True)
user_id = Column(String, nullable=False, unique=True)
name = Column(String, nullable=False)
- 스키마 생성
정의한 테이블과 1번에서 생성한 engine 을 사용하여 실제 database 에 우리가 정의한 테이블 스키마를 생성할 수 있다. 이때는 base 클래스의 MetaData 의 craete_all() 메서드를 사용하는데, 이를 통해서 base 클래스에 정의된 메타데이터의 내용들이 모두 database 에 생성된다.
반대로 메타데이터에 있는 내용들을 모두 database 에서 제거하고 싶으면 drop_all() 을 사용하면 된다.
Base.metadata.create_all(engine) # 스키마 생성
Base.metadata.drop_all(engine) # 스키마 제거
3. Session 생성 - sesionmaker
이제 생성된 스키마에 실제 데이터를 쿼리하는 쿼리문을 실행하기 위해서는 Session 객체를 생성해야 한다. Session 객체는 ORM 으로 매핑된 객체들의 작업을 관리해주는 holding zone 으로 세션에서 작업이 된 후에 commit 이나 rollback 이 호출되는 경우 실제 database 에 해당 작업들이 적용된다.
Session 의 인터페이스를 통해서 수행된 객체들의 작업은 각 세션 내부 (identity map 구조 내부) 에서만 유지된다. 쿼리를 수행하면 연결된 Engine 에서 쿼리와 관련된 리소스를 요청하여 transaction 을 설정한다. 이 transaction 은 commit 이나 rollback 을 호출할 때까지 유효한데, transaction 의 작업들은 Session 에서 유지되다가 commit 이 되는 순간 database 로 flush 된다.
세션은 Session 클래스를 사용해서 생성할 수도 있고, sessionmaker 를 사용해서 생성할 수도 있다. 이때 database 와 연결되어 있는 Engine 을 bind 해주어야 한다.
from sqlalchemy.orm import sessionmaker
session = sessionmaker(bind=engine)
session.commit()
[Reference]
'Tech > SQLAlchemy' 카테고리의 다른 글
[SQLAlchemy] imperative mapping (0) | 2023.11.11 |
---|---|
[SQLAlchemy] Relationship - CASCADE (0) | 2023.11.06 |
[SQLAlchemy] 연관관계 설정 (0) | 2022.07.23 |