SQLAlchemy
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
SQLAlchemy는 2006년 처음 출시된 파이썬용 오픈 소스 SQL 툴킷이다. 데이터베이스 상호 작용을 위한 다양한 기능을 제공하며, 객체 관계형 매퍼(ORM) 및 SQL 표현 언어를 포함한다. 자바의 하이버네이트와 유사한 데이터 매퍼 패턴을 채택하여, 관계형 데이터베이스가 커지고 성능이 중요해질 때 객체 컬렉션처럼 동작하지 않도록 설계되었다.
더 읽어볼만한 페이지
- 객체 관계 매핑 - 마이바티스
마이바티스는 자바 객체를 SQL 구문에 매핑하는 ORM 프레임워크이며, JDBC보다 단순한 코딩과 SQL 문 실행을 지원하고, XML 파일이나 어노테이션에 SQL 문을 저장하여 관리하며, 스프링 프레임워크와의 통합, 선언적 데이터 캐싱, 코드 생성기 등의 기능을 제공한다. - 객체 관계 매핑 - 엔티티 프레임워크
엔티티 프레임워크는 .NET 환경에서 O/R 매핑을 통해 데이터베이스 작업을 간편하게 처리하도록 마이크로소프트에서 개발한 기술로, 개발자가 엔티티를 통해 데이터를 조작하여 코드 양을 줄이고 애플리케이션 개발 및 유지보수를 간소화하며, 다양한 데이터베이스 시스템과의 호환성을 제공한다. - 파이썬 라이브러리 - Tkinter
Tkinter는 Tcl/Tk 툴킷을 파이썬 래퍼로 구현한 GUI 표준 라이브러리로서, 다양한 위젯과 배치 관리자를 제공하며 테마 Tk 기능을 통해 위젯 외관을 변경할 수 있도록 지원한다. - 파이썬 라이브러리 - SciPy
SciPy는 NumPy 배열 구조를 기반으로 수치 적분, 선형 대수, 최적화, 통계 등 과학 및 공학 계산에 사용되는 다양한 기능을 제공하는 파이썬 과학 컴퓨팅 라이브러리이다. - 2006년 소프트웨어 - 마이크로소프트 오피스 2007
마이크로소프트 오피스 2007은 리본 인터페이스와 Office Open XML 형식을 도입하고 다양한 기능 향상을 제공한 오피스 제품군으로, 여러 에디션 출시와 함께 비판, 호환성 문제, 특허 논란이 있었으며 2018년 4월에 지원이 종료되었다. - 2006년 소프트웨어 - TrueOS
TrueOS는 2005년 PC-BSD로 시작하여 FreeBSD를 기반으로 사용 편의성을 강조한 운영 체제이며, 2016년 TrueOS로 이름이 변경되었으나 2020년에 개발이 중단되었다.
| SQLAlchemy - [IT 관련 정보]에 관한 문서 | |
|---|---|
| 기본 정보 | |
![]() | |
| 개발자 | Michael Bayer |
| 최초 출시일 | 2006년 2월 14일 |
| 안정화 버전 | 2.0.23 |
| 안정화 버전 출시일 | 2023년 10월 11일 |
| 프로그래밍 언어 | Python |
| 운영체제 | 크로스 플랫폼 |
| 종류 | 객체 관계 매핑 |
| 라이선스 | MIT 라이선스 |
| 웹사이트 | SQLAlchemy 공식 웹사이트 |
2. 역사
SQLAlchemy는 2006년 2월에 처음 출시되었다.[9][14] 데이터베이스 상호 작용을 위한 광범위한 기능을 포함하도록 발전했으며, 파이썬 개발자들 사이에서 인기를 얻었다. 주요 버전 출시 이력은 다음과 같다.
- 버전 0.1 (2006년): 초기 릴리스.
- 버전 1.0 (2015년): ORM 및 SQL 표현 언어의 주요 개선 사항.
- 버전 1.4 (2021년): 새로운 ORM API 도입.
- 버전 2.0 베타 (2022년 10월): 출시.[14][15]
- 버전 2.0 정식 (2023년 초): 출시.[14][15]
3. 특징
SQLAlchemy는 데이터베이스 스키마 생성, 쿼리, 객체 관계 매핑(ORM)을 위한 도구를 제공한다. 주요 기능은 다음과 같다.
- SQLAlchemy Core: SQL 쿼리를 구성하고 실행하는 방법을 제공하는 파이썬의 SQL을 위한 포괄적인 내장 도메인 특정 언어이다.
- ORM: 파이썬 클래스를 데이터베이스 테이블에 매핑할 수 있는 강력한 객체 관계 매핑 기능이다.
- 데이터베이스 스키마 마이그레이션 지원.
- 여러 데이터베이스 백엔드와의 호환성.
- 데이터베이스 연결 풀링 및 트랜잭션 관리를 위한 도구.
SQLAlchemy의 철학은 관계형 데이터베이스가 규모가 커지고 성능이 중요해질수록 객체 컬렉션처럼 작동하기 어렵고, 반대로 객체 컬렉션은 추상화될수록 테이블이나 행처럼 작동하기 어렵다는 점을 고려하는 것이다. 이 때문에 SQLAlchemy는 다른 많은 객체 관계 매퍼가 채택하는 액티브 레코드 패턴 대신 Data mapper pattern|데이터 매퍼 패턴영어을 채택하고 있다. 이는 자바 언어의 Hibernate와 유사한 방식이다.[12]
4. 철학
SQLAlchemy의 철학은 관계형 데이터베이스는 규모가 커지고 성능이 중요해지기 시작하면서 객체 컬렉션처럼 동작하는 방식과는 거리가 멀어지고, 반대로 객체 컬렉션은 추상화가 더 많이 이루어질수록 테이블 및 행처럼 동작하는 방식과 달라진다는 점에 기반한다. 이러한 이유로 SQLAlchemy는 다른 여러 객체 관계형 매퍼(ORM)에서 사용하는 액티브 레코드 패턴 대신 데이터 매퍼 패턴을 채택했다. 이는 자바용 하이버네이트와 유사한 방식이다.[13][12]
5. 예제
다음 예제는 ORM을 사용하여 영화와 감독 간의 다대일(n:1) 관계를 다루는 방법을 보여준다. 사용자 정의 파이썬 클래스를 데이터베이스 테이블에 매핑하여 스키마를 정의하고(#스키마 정의), 관계를 가진 객체 인스턴스를 생성하여 데이터를 삽입하며(#데이터 삽입), 마지막으로 저장된 데이터를 다양한 방식으로 조회(#쿼리)하는 과정을 설명한다. 특히 데이터를 조회할 때 지연 로딩 방식과 조기 로딩(또는 일괄 로딩) 방식에 따라 SQL 쿼리가 어떻게 달라지는지도 살펴볼 수 있다.
5. 1. 스키마 정의
SQLAlchemy는 파이썬 클래스를 데이터베이스 테이블에 매핑하여 ORM 기능을 제공한다. 다음은 `Movie`와 `Director`라는 두 개의 파이썬 클래스를 정의하고, 이를 각각 `movies`와 `directors`라는 데이터베이스 테이블로 생성하는 예시 코드이다.from sqlalchemy import Column, Integer, String, ForeignKey, create_engine
from sqlalchemy.orm import relationship, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
# 매핑 선언을 위한 기본 클래스 생성
Base = declarative_base()
# Movie 클래스 정의: 'movies' 테이블과 매핑
class Movie(Base):
__tablename__ = "movies" # 데이터베이스 테이블 이름 지정
# 테이블 컬럼 정의
id = Column(Integer, primary_key=True) # 기본 키 컬럼
title = Column(String(255), nullable=False) # 문자열 컬럼, Null 허용 안 함
year = Column(Integer) # 정수형 컬럼
# 외래 키 설정: 'directors' 테이블의 'id' 컬럼 참조
directed_by = Column(Integer, ForeignKey("directors.id"))
# 관계 설정: Director 객체와 연결
# backref를 통해 Director 객체에서 해당 감독의 영화 목록(movies)에 접근 가능
director = relationship("Director", backref="movies", lazy=False)
def __init__(self, title=None, year=None):
self.title = title
self.year = year
def __repr__(self):
# 객체를 문자열로 표현하는 방식 정의
return f"Movie({self.title!r}, {self.year!r}, {self.director!r})"
# Director 클래스 정의: 'directors' 테이블과 매핑
class Director(Base):
__tablename__ = "directors" # 데이터베이스 테이블 이름 지정
# 테이블 컬럼 정의
id = Column(Integer, primary_key=True) # 기본 키 컬럼
name = Column(String(50), nullable=False, unique=True) # 문자열 컬럼, Null 허용 안 함, 고유 값
def __init__(self, name=None):
self.name = name
def __repr__(self):
# 객체를 문자열로 표현하는 방식 정의
return f"Director({self.name!r})"
# 데이터베이스 연결 엔진 생성 (실제 사용 시 DBMS 정보로 대체 필요)
# 예: "postgresql://user:password@host:port/database"
# 예: "mysql+mysqlconnector://user:password@host:port/database"
# 예: "sqlite:///mydatabase.db"
engine = create_engine("dbms://user:pwd@host/dbname")
# 정의된 모든 테이블 스키마를 데이터베이스에 생성
Base.metadata.create_all(engine)
위 코드에서 `declarative_base()` 함수는 매핑될 클래스들이 상속받을 기본 클래스(`Base`)를 생성한다. 각 클래스(`Movie`, `Director`)는 `Base`를 상속받고, `__tablename__` 속성을 통해 연결될 데이터베이스 테이블 이름을 명시한다.
클래스 내부에서는 `Column` 객체를 사용하여 테이블의 컬럼을 정의한다. `Column`에는 데이터 타입(Integer, String 등)과 제약 조건(primary_key, `nullable`, `unique`, ForeignKey) 등을 지정할 수 있다.
`relationship` 함수는 클래스 간의 관계를 정의한다. `Movie` 클래스의 `director` 속성은 `Director` 클래스와의 관계를 나타내며, `ForeignKey("directors.id")`를 통해 `movies` 테이블의 `directed_by` 컬럼이 `directors` 테이블의 `id` 컬럼을 참조함을 명시한다. `backref="movies"` 설정은 `Director` 객체에서도 자신과 연결된 `Movie` 객체 목록에 `movies`라는 이름으로 접근할 수 있게 한다.
마지막으로 `create_engine` 함수를 사용하여 데이터베이스 연결을 설정하고, `Base.metadata.create_all(engine)`을 호출하면 정의된 클래스(`Movie`, `Director`)에 해당하는 테이블(`movies`, `directors`)이 실제 데이터베이스에 생성된다.
5. 2. 데이터 삽입
ORM을 사용하면 관련된 데이터(예: 감독과 영화)를 삽입할 때, 어느 한쪽 객체를 통해 관계를 설정하고 데이터베이스 세션에 추가하는 방식으로 작업을 수행할 수 있다. 예를 들어, 영화 객체에 감독 정보를 연결하거나 감독 객체에 영화 목록을 연결하는 두 가지 방식 모두 가능하다.다음은 파이썬 코드 예시이다.
```python
from sqlalchemy.orm import sessionmaker
# 세션 생성 (engine 객체는 미리 정의되어 있다고 가정)
Session = sessionmaker(bind=engine)
session = Session()
# 방식 1: Movie 객체를 생성하고 director 속성에 Director 객체를 할당
m1 = Movie("Robocop", 1987)
m1.director = Director("Paul Verhoeven")
# 방식 2: Director 객체를 생성하고 movies 속성에 Movie 객체 리스트를 할당
d2 = Director("George Lucas")
d2.movies = [Movie("Star Wars", 1977), Movie("THX 1138", 1971)]
try:
# 준비된 객체들을 세션에 추가
# m1을 추가하면 m1.director에 할당된 Director 객체도 함께 처리됨
session.add(m1)
# d2를 추가하면 d2.movies에 포함된 Movie 객체들도 함께 처리됨
session.add(d2)
# 모든 변경사항을 데이터베이스에 최종 반영 (커밋)
session.commit()
except Exception as e:
# 데이터베이스 작업 중 오류 발생 시, 변경사항을 모두 되돌림 (롤백)
print(f"데이터 삽입 중 오류 발생: {e}")
session.rollback()
finally:
# 세션 리소스 정리
session.close()
```
위 코드에서는 `m1` 객체와 연결된 `Director` 객체, 그리고 `d2` 객체와 연결된 `Movie` 객체 리스트가 `session.add()` 메서드를 통해 세션에 추가된다. SQLAlchemy는 이렇게 관계가 설정된 객체들을 자동으로 인식하여 함께 처리한다. `session.commit()`이 호출되면, 이 모든 객체 정보가 하나의 트랜잭션으로 묶여 데이터베이스에 저장된다. 만약 이 과정에서 오류가 발생하면 `session.rollback()`을 통해 모든 변경사항이 취소되어 데이터 일관성을 유지한다.
5. 3. 쿼리
다음은 SQLAlchemy가 모든 데이터를 쿼리하여 출력하는 예시이다.```python
alldata = session.query(Movie).all()
for somedata in alldata:
print(somedata)
```
위 코드를 실행하면, SQLAlchemy는 DBMS에 다음 SQL 쿼리를 실행한다 (별칭은 생략). 이 쿼리는 `movies` 테이블과 `directors` 테이블을 LEFT OUTER JOIN하여 영화 정보와 해당 감독 정보를 함께 가져온다.
```sql
SELECT movies.id, movies.title, movies.year, movies.directed_by, directors.id, directors.name
FROM movies LEFT OUTER JOIN directors ON directors.id = movies.directed_by
```
쿼리 실행 결과 출력은 다음과 같다.
```python
Movie('Robocop', 1987L, Director('Paul Verhoeven'))
Movie('Star Wars', 1977L, Director('George Lucas'))
Movie('THX 1138', 1971L, Director('George Lucas'))
```
만약 관계 설정 시 `lazy=True` 옵션(기본값)을 사용하면, SQLAlchemy는 다른 방식으로 동작한다. 처음에는 영화 목록만 가져오는 쿼리를 실행하고, 각 영화 객체의 감독 정보에 접근할 때(즉, 필요할 때 '지연 로딩' 방식으로) 해당 감독의 이름을 가져오는 별도의 쿼리를 실행한다.
```sql
- - 영화 목록을 가져오는 초기 쿼리
SELECT movies.id, movies.title, movies.year, movies.directed_by
FROM movies
- - 각 영화의 감독 정보가 필요할 때 실행되는 쿼리 (각 영화마다 실행될 수 있음)
SELECT directors.id, directors.name
FROM directors
WHERE directors.id = %s -- %s는 해당 영화의 directed_by 값으로 대체됨
참조
[1]
웹사이트
Mike Bayer is the creator of SQLAlchemy and Mako Templates for Python
http://techspot.zzze[...]
[2]
웹사이트
Download - SQLAlchemy
http://www.sqlalchem[...]
SQLAlchemy
2015-02-21
[3]
웹사이트
zzzeek / sqlalchemy / source / LICENSE
https://bitbucket.or[...]
BitBucket
2015-02-21
[4]
웹사이트
0.1 Changelog — SQLAlchemy 2.0 Documentation
https://docs.sqlalch[...]
2024-07-04
[5]
웹사이트
1.0 Changelog — SQLAlchemy 2.0 Documentation
https://docs.sqlalch[...]
2024-07-04
[6]
웹사이트
1.4 Changelog — SQLAlchemy 2.0 Documentation
https://docs.sqlalch[...]
2024-07-04
[7]
웹사이트
Mike Bayer is the creator of SQLAlchemy and Mako Templates for Python
http://techspot.zzze[...]
[8]
웹사이트
Interview Mike Bayer SQLAlchemy #pydata #python
https://decisionstat[...]
[9]
웹사이트
Download - SQLAlchemy
http://www.sqlalchem[...]
SQLAlchemy
2015-02-21
[10]
웹사이트
Releases - sqlalchemy/sqlalchemy
https://github.com/s[...]
2022-08-08
[11]
웹사이트
zzzeek / sqlalchemy / source / LICENSE
https://bitbucket.or[...]
BitBucket
2015-02-21
[12]
웹사이트
The architecture of open source applications
http://www.aosabook.[...]
[13]
웹사이트
The architecture of open source applications
http://www.aosabook.[...]
[14]
웹인용
Python News: What's New From October 2022
https://realpython.c[...]
[15]
웹인용
The best ORMs for database-powered Python apps
https://www.arnnet.c[...]
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com
