[python] SQLAlchemy에서 테이블 간의 관계를 어떻게 정의하고 사용하나요?

SQLAlchemy는 Python에서 사용할 수 있는 강력한 ORM(Object-Relational Mapping) 라이브러리입니다. ORM은 데이터베이스 테이블과 객체 간의 매핑을 도와주는 도구로, 객체 지향 프로그래밍과 관계형 데이터베이스 간의 상호 작용을 더욱 쉽게 만들어줍니다.

SQLAlchemy에서 테이블 간의 관계를 정의하고 사용하기 위해 다음과 같은 단계를 따를 수 있습니다:

  1. 테이블 클래스 정의하기: 우선, 테이블 간의 관계를 정의할 각각의 테이블에 대해 클래스를 정의합니다. 이 클래스는 declarative_base 함수를 사용하여 Base 클래스로 생성됩니다. 예를 들어, 사용자(User) 테이블과 주문(Order) 테이블을 정의하려면 다음과 같이 할 수 있습니다:

    from sqlalchemy import Column, Integer, String, ForeignKey
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import relationship
    
    Base = declarative_base()
    
    class User(Base):
        __tablename__ = 'users'
        id = Column(Integer, primary_key=True)
        name = Column(String)
        orders = relationship('Order', backref='user')
    
    class Order(Base):
        __tablename__ = 'orders'
        id = Column(Integer, primary_key=True)
        product = Column(String)
        user_id = Column(Integer, ForeignKey('users.id'))
    
  2. 관계 정의하기: 위의 예시에서는 relationship 함수를 사용하여 User 클래스와 Order 클래스 사이의 관계를 정의합니다. User 클래스 내에서 orders 속성은 Order 클래스의 인스턴스들을 담는 리스트로 동작하며, backref 매개변수는 Order 클래스에서 user 액세스할 수 있는 방법을 제공합니다.

  3. 관계 사용하기: 관계를 사용하여 연결된 테이블 간에 데이터를 가져올 수 있습니다. 예를 들어, 특정 사용자가 주문한 모든 주문을 가져오려면 다음과 같이 할 수 있습니다:

    user = session.query(User).first()
    orders = user.orders
    for order in orders:
        print(order.product)
    

    위의 코드에서 session.query(User).first()는 데이터베이스에서 첫 번째 사용자를 가져오는 것이고, user.orders는 해당 사용자와 관련된 주문을 가져옵니다.

SQLAlchemy를 사용하여 테이블 간의 관계를 정의하고 사용하는 방법에 대해 알아보았습니다. 더 자세한 내용은 SQLAlchemy 공식 문서를 참조해보시기 바랍니다.

참고 자료: