본문 바로가기
Category/Python

SQLAlchemy란?

by Corinee 2024. 9. 18.
728x90
반응형

SQLAlchemy는 Python에서 사용하는 ORM(Object Relational Mapping) 라이브러리이자 데이터베이스를 다루는 도구입니다. SQLAlchemy는 크게 두 가지 주요 구성 요소로 나뉩니다: SQLAlchemy ORMSQLAlchemy Core입니다. 이 두 가지 모두 데이터베이스와 상호작용할 수 있지만, ORM은 객체 지향적인 방식으로 데이터를 다루고, Core는 SQL을 직접 작성하고 실행하는 방식을 더 중시합니다.

1. SQLAlchemy ORM (객체 관계 매핑)

ORM은 객체(Object)와 데이터베이스 테이블 간의 매핑을 통해 SQL 쿼리를 작성하지 않고도 데이터베이스 작업을 할 수 있게 해줍니다. SQLAlchemy ORM은 Python 클래스와 데이터베이스 테이블을 매핑하여 데이터베이스 레코드를 Python 객체로 다루는 기능을 제공합니다.

예를 들어, 테이블에서 데이터를 가져오면 그것은 객체로 변환되고, Python에서 객체를 수정하면 그것이 데이터베이스에서 자동으로 업데이트됩니다.

기본 예시: ORM을 사용한 모델 정의

from flask_sqlalchemy import SQLAlchemy

# SQLAlchemy 객체 생성
db = SQLAlchemy()

# 데이터베이스 테이블과 매핑되는 모델 클래스 정의
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

    def __repr__(self):
        return f'<User {self.username}>'

위 코드에서는 User라는 클래스를 정의했습니다. 이 클래스는 users라는 데이터베이스 테이블과 매핑되며, 테이블의 각 열은 클래스의 속성으로 매핑됩니다. db.Model은 SQLAlchemy가 제공하는 기본 모델 클래스입니다.

  • id: 기본 키 역할을 하는 정수형 열.
  • username: 문자열 열로, 고유하고 비어있을 수 없음.
  • email: 문자열 열로, 고유하고 비어있을 수 없음.

이제 SQLAlchemy는 이 모델을 사용하여 자동으로 SQL 쿼리를 생성하고 실행할 수 있습니다.

CRUD 작업 (생성, 읽기, 업데이트, 삭제)

SQLAlchemy ORM을 사용하면 데이터를 객체 지향 방식으로 다룰 수 있습니다.

1. 데이터 생성 (Create)

new_user = User(username='john_doe', email='john@example.com')
db.session.add(new_user)
db.session.commit()  # 데이터베이스에 커밋

2. 데이터 조회 (Read)

# 모든 사용자 조회
users = User.query.all()

# 특정 사용자 조회
user = User.query.filter_by(username='john_doe').first()

3. 데이터 업데이트 (Update)

user = User.query.filter_by(username='john_doe').first()
user.email = 'john_doe_updated@example.com'
db.session.commit()  # 변경 사항 커밋

4. 데이터 삭제 (Delete)

user = User.query.filter_by(username='john_doe').first()
db.session.delete(user)
db.session.commit()  # 데이터베이스에서 삭제

2. SQLAlchemy Core (SQL 표현 언어)

SQLAlchemy Core는 ORM 없이 SQL을 직접 작성하고 실행하는 방식을 지원합니다. Core를 사용하면 ORM 없이도 SQLAlchemy의 강력한 SQL 생성 및 실행 기능을 사용할 수 있습니다.

SQLAlchemy Core의 기본 사용 예시:

from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String

# 데이터베이스 연결
engine = create_engine('sqlite:///mydatabase.db')
metadata = MetaData()

# 테이블 정의
users = Table('users', metadata,
              Column('id', Integer, primary_key=True),
              Column('username', String, nullable=False),
              Column('email', String, nullable=False))

# 데이터베이스에 테이블 생성
metadata.create_all(engine)

# 데이터 삽입
with engine.connect() as connection:
    insert_query = users.insert().values(username='john_doe', email='john@example.com')
    connection.execute(insert_query)

Core를 사용하면 더 낮은 수준에서 SQL을 직접 조작하고 실행할 수 있으며, ORM을 사용하지 않는 경우에도 유용합니다.

3. SQLAlchemy를 Flask와 함께 사용하기

Flask 애플리케이션에서는 Flask-SQLAlchemy 확장을 사용하여 SQLAlchemy와 쉽게 통합할 수 있습니다. Flask-SQLAlchemy는 SQLAlchemy의 기능을 Flask에 맞춰 최적화한 라이브러리입니다.

Flask에서 SQLAlchemy 설정

  1. Flask 애플리케이션을 설정하고 데이터베이스 URI를 설정합니다.
  2. SQLAlchemy 객체를 생성하고 Flask 애플리케이션과 연결합니다.
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)

# 모델 정의
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

4. 장점

  • 생산성 향상: SQLAlchemy를 사용하면 SQL 쿼리를 직접 작성하지 않고도 객체를 통해 데이터베이스와 상호작용할 수 있습니다.
  • 안전성: SQLAlchemy는 SQL 인젝션을 방지하는 등 보안에 강한 설계를 갖고 있습니다.
  • 유연성: ORM 방식뿐만 아니라 SQLAlchemy Core를 사용하여 원시 SQL 쿼리를 사용할 수 있습니다.
  • 다중 데이터베이스 지원: MySQL, PostgreSQL, SQLite, Oracle 등 다양한 데이터베이스를 지원합니다.

5. 단점

  • 추가 학습 필요: SQLAlchemy는 기능이 매우 많아, 완전히 이해하고 사용하려면 추가 학습이 필요할 수 있습니다.
  • 복잡한 쿼리: ORM은 간단한 작업에는 매우 편리하지만, 복잡한 쿼리는 때로는 ORM보다 직접 SQL을 작성하는 것이 더 효율적일 수 있습니다.

요약

SQLAlchemy는 Python에서 데이터베이스 작업을 쉽게 할 수 있도록 도와주는 ORM 도구이자 SQL 생성기입니다. Flask와 같은 웹 애플리케이션에서 자주 사용되며, 데이터를 객체 지향적으로 다루고, 데이터베이스 작업을 더 간단하고 안전하게 처리할 수 있게 해줍니다. SQLAlchemy를 사용하면 데이터베이스 테이블을 Python 클래스처럼 다룰 수 있고, 이를 통해 다양한 CRUD 작업을 손쉽게 수행할 수 있습니다.

'Category > Python' 카테고리의 다른 글

Python에서 __init__과 self의 역할  (0) 2024.11.17
zip 함수란?  (0) 2024.11.16
Python 가상 환경이란?  (1) 2024.09.16
RotatingFileHandler란?  (0) 2024.09.16
파이썬 객체를 문자열로 표현하기 __str__  (0) 2024.09.11