본문 바로가기

Tech/SQLAlchemy

[SQLAlchemy] SQLAlchemy 기본 설명

반응형

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]

https://www.sqlalchemy.org/

 

SQLAlchemy - The Database Toolkit for Python

The Python SQL Toolkit and Object Relational Mapper SQLAlchemy is the Python SQL toolkit and Object Relational Mapper that gives application developers the full power and flexibility of SQL. It provides a full suite of well known enterprise-level persisten

www.sqlalchemy.org

 

반응형

'Tech > SQLAlchemy' 카테고리의 다른 글

[SQLAlchemy] imperative mapping  (0) 2023.11.11
[SQLAlchemy] Relationship - CASCADE  (0) 2023.11.06
[SQLAlchemy] 연관관계 설정  (0) 2022.07.23