[파이썬] SQLAlchemy 서브클래스 및 상속 관계

SQLAlchemy는 파이썬에서 ORM(Object-Relational Mapping)을 위한 강력한 도구입니다. ORM을 사용하면 데이터베이스 테이블과 파이썬 클래스 간의 매핑 관계를 쉽게 정의할 수 있으며, SQL 쿼리를 직접 작성할 필요 없이 객체 지향적인 방식으로 데이터를 다룰 수 있습니다. 이번 블로그 포스트에서는 SQLAlchemy에서 서브클래스와 상속을 사용하여 데이터베이스의 테이블 간의 관계를 모델링하는 방법에 대해 알아보겠습니다.

상속 관계 모델링

상속 관계를 이해하기 위해 예시로 PersonEmployee라는 두 개의 테이블을 가진 데이터베이스를 생각해봅시다. Person은 모든 사람의 공통 속성을 나타내고, EmployeePerson에 추가적인 속성을 가지고 있습니다. 이런 경우, EmployeePerson을 상속받는 서브클래스로 모델링할 수 있습니다.

from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Person(Base):
    __tablename__ = 'person'
    id = Column(Integer, primary_key=True)
    name = Column(String(50))

class Employee(Person):
    __tablename__ = 'employee'
    id = Column(Integer, primary_key=True)
    salary = Column(Integer)

위의 코드에서는 Person 클래스와 Employee 클래스를 SQLAlchemy의 declarative_base를 상속받는 방식으로 정의하였습니다. 각 클래스는 데이터베이스 테이블을 나타내며, __tablename__ 속성을 통해 테이블 이름을 정의하였습니다. Person 테이블은 idname 속성을 가지고 있으며, Employee 테이블은 추가로 salary 속성을 가지고 있습니다.

상속 관계 활용

이제 PersonEmployee 클래스를 사용하여 데이터베이스의 테이블을 다루는 방법을 알아보겠습니다.

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

engine = create_engine('sqlite:///example.db')
Base.metadata.create_all(engine)

Session = sessionmaker(bind=engine)
session = Session()

person = Person(name='John Smith')
session.add(person)

employee = Employee(name='Jane Doe', salary=5000)
session.add(employee)

session.commit()

위의 코드에서는 SQLAlchemy의 create_engine 함수를 사용하여 데이터베이스를 연결하고, Base.metadata.create_all 메서드를 호출하여 클래스를 기반으로 테이블을 생성합니다. sessionmaker를 사용하여 세션을 생성하고, session.add를 통해 객체를 데이터베이스에 추가한 뒤 session.commit을 호출하여 저장합니다.

상속 관계를 활용하면 Person 클래스를 사용하여 Employee 테이블을 다룰 수 있습니다. 이는 코드의 재사용성과 일관성을 높여줍니다.

결론

SQLAlchemy를 사용하여 상속 관계를 모델링하면 데이터베이스의 테이블 간의 관계를 효율적으로 표현할 수 있습니다. 서브클래스와 상속을 활용하여 코드의 재사용성을 높이고 일관성 있는 데이터베이스 모델을 유지할 수 있습니다. SQLAlchemy의 강력한 ORM 기능을 활용하여 데이터베이스 작업을 쉽고 편리하게 처리할 수 있습니다.

References: