[Python] SQLAlchemy

2sky·2024년 5월 13일

ORM이란?

  • 파이썬 ORM(객체 관계 매핑)은 데이터베이스와의 상호 작용을 객체 지향 프로그래밍에서 사용되는 객체와의 상호 작용으로 변환해주는 기술
  • 일반적으로 데이터베이스의 테이블을 파이썬 클래스로 매핑하고, 테이블의 레코드를 객체로 매핑
  • 데이터베이스와의 상호 작용을 객체 지향적으로 처리할 수 있으며, SQL 쿼리를 직접 작성하지 않고도 데이터를 쉽게 검색, 추가, 수정, 삭제
  • 대표적인 파이썬 ORM 라이브러리 - SQLAlchemy와 Django ORM

SQLAlchemy

  • 파이썬으로 작성된 SQL 데이터베이스 툴킷 및 ORM(객체 관계 매핑) 라이브러리
  • 자체적으로 스키마를 생성하지 않음
    - 앱이나 DB시스템에 간섭 X
  • 애플리케이션 개발자에게 SQL의 모든 기능과 유연성을 제공하는 Python SQL 도구 키트이자 개체 관계형 매퍼
  • 데이터베이스 <--> Object 를 매핑
from sqlalchemy import create_engine, Column, Integer, String, text
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
import os
from dotenv import load_dotenv

# 데이터베이스 연결 정보
db_user = os.getenv('db_user')
db_password = os.getenv('db_password')
db_port = os.getenv("db_port")
db_host = os.getenv('db_host')
db_name = os.getenv('db_name')

# MySQL에 연결하기 위한 연결 문자열
# mysql://username:password@hostname:port/database_name
# 실제 연결 정보에 맞게 수정해주세요.
# connection_string = 'mysql+mysqldb://sky:0000@localhost:3306/example' #연결 정보 #mysql


DATABASE_URL = f"postgresql+psycopg2://{db_user}:{db_password}@{db_host}:{db_port}/{db_name}"   # postgre 도 연결해보기


# 데이터베이스 연결 설정
engine = create_engine(DATABASE_URL, echo=True) 

#연결테스트
# with engine.connect() as connection:  
#     result = connection.execute(text("SELECT 1"))
#     print(result.fetchall())

# Base 클래스 생성
Base = declarative_base()

# 학생 정보를 담는 클래스 정의
class Student(Base):
    __tablename__ = 'students'
    id = Column(Integer, primary_key=True)  
    name = Column(String(255))
    age = Column(Integer)

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

# 세션 생성
Session = sessionmaker(bind=engine)
session = Session()

# 학생 정보 추가
student1 = Student(name='John', age=20)
student2 = Student(name='Alice', age=22)

session.add(student1)
session.add(student2)
session.commit()

# 모든 학생 정보 가져오기
students = session.query(Student).all()

# filter을 활용하여 조건 추가도 가능
# students_above_21 = session.query(Student).filter(Student.age >= 21).all() #21살 이상인 사람들의 데이터만 가져오기
# students_john_above_21 = session.query(Student).filter(Student.age >= 21, Student.name == 'John').all() # 이름이 john이고 21살 이상인 사람만 가져오기

for student in students:
    print(f'이름: {student.name}, 나이: {student.age}')

# 세션 종료
session.close()
  • create_engine: SQLAlchemy에서 데이터베이스 연결을 관리하는 데 사용됩니다. 데이터베이스 유형 및 연결 정보를 지정하여 엔진을 생성
  • Column, Integer, String: SQLAlchemy에서 테이블의 열을 정의하는 데 사용됩니다. 각 열의 데이터 유형을 지정하고 제약 조건을 추가 가능
  • declarative_base: SQLAlchemy에서 ORM 클래스를 만들 때 사용, 이 클래스를 상속하여 ORM클래스를 정의
  • sessionmaker: SQLAlchemy에서 세션을 생성하는 데 사용
    • 데이터베이스와의 상호작용을 추상화하고 트랙잭션을 관리
  • engine = create_engine('sqlite:///students.db', echo=True): SQLite 데이터베이스 파일 'students.db'와의 연결을 설정. echo=True는 엔진이 실행되는 모든 SQL 명령을 콘솔에 출력하도록 하는 옵션 > 이는 개발 및 디버깅을 돕기 위한 것
  1. Base = declarative_base(): ORM 클래스를 생성하기 위한 기본 클래스를 정의. 이 클래스를 상속받아 테이블을 나타내는 ORM 클래스를 정의
  2. class Student(Base):: Student 클래스를 정의. 이 클래스는 Base 클래스를 상속받았으므로 SQLAlchemy에서 제공하는 기능을 모두 활용할 수 있음.
  3. __tablename__ = 'students': 이 클래스가 매핑될 데이터베이스 테이블의 이름을 지정. 여기서는 'students'라는 이름을 사용합니다.
  4. id = Column(Integer, primary_key=True): Student 클래스의 id 속성을 정의. 이 속성은 정수형으로 선언되고, 기본 키(primary key)로 설정.
  5. name = Column(String): Student 클래스의 name 속성을 정의. 이 속성은 문자열로 선언.
  6. age = Column(Integer): Student 클래스의 age 속성을 정의. 이 속성은 정수형으로 선언.
  7. Base.metadata.create_all(engine): SQLAlchemy에서 정의한 모든 테이블을 데이터베이스에 생성. 이 코드는 위에서 정의한 Student 클래스에 해당하는 테이블을 생성.
  8. Session = sessionmaker(bind=engine): 데이터베이스와 상호 작용하기 위한 세션을 생성. bind 매개변수에는 engine을 전달하여 세션이 데이터베이스와 연결.
  9. session = Session(): 위에서 생성한 세션 객체를 생성. 이제 이 세션을 사용하여 데이터베이스와 상호 작용

조금 이해하기 어려웠는데 아래와 같은 식으로 이해를 했음.

  1. *Base는 "양식이 있는 빈 템플릿"입니다. 이것은 SQLAlchemy에서 사용하는 모든 모델 클래스를 위한 기본 구조와 메타데이터를 제공합니다. 이 템플릿은 데이터베이스 테이블과 Python 클래스 사이의 연결을 가능하게 하는 데 필요한 정보를 포함하고 있습니다.**
  2. *class Student(Base)는 "양식이 있는 빈 템플릿에 뼈대를 잡는 것"입니다. 여기서는 실제 데이터베이스 테이블에 해당하는 속성(예: id, name, age 등)을 정의하여 students 테이블의 구조를 Python 코드로 표현합니다. 이 과정에서 Base로부터 상속받은 메타데이터를 활용하여 테이블과 클래스 사이를 연결합니다.**
  3. *밑에서 정보 추가하는 부분은 "양식을 채워넣는 것"입니다. 여기서는 Student 클래스를 사용하여 실제 데이터베이스에 데이터를 추가하거나 조회하는 등의 작업을 할 수 있습니다. 예를 들어, Student 인스턴스를 생성하고 세션을 통해 데이터베이스에 커밋하는 작업 등이 여기에 속합니다.**
profile
하늘하늘한 하늘

0개의 댓글