[파이썬] SQLAlchemy 관계 (Relationships) 설정

SQLAlchemy is a popular Object Relational Mapping (ORM) library for Python. It provides a powerful and flexible way to work with databases by mapping database tables to Python classes and allowing you to seamlessly interact with the database using Python code.

One of the key features of SQLAlchemy is its support for defining and managing relationships between different tables. Relationships allow you to establish logical connections between tables and query related data easily.

In this blog post, we will explore how to configure relationships in SQLAlchemy using the declarative base approach.

Defining Tables and Classes

Before we can establish relationships between tables, we need to define the tables and corresponding Python classes using SQLAlchemy’s declarative base. Let’s consider a simple example with two tables: Author and Book.

from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship

Base = declarative_base()

class Author(Base):
    __tablename__ = 'authors'

    id = Column(Integer, primary_key=True)
    name = Column(String)

    books = relationship("Book", back_populates="author")

class Book(Base):
    __tablename__ = 'books'

    id = Column(Integer, primary_key=True)
    title = Column(String)
    author_id = Column(Integer, ForeignKey('authors.id'))

    author = relationship("Author", back_populates="books")

In the above code, we define two classes Author and Book which inherit from the Base class provided by SQLAlchemy. We use the __tablename__ attribute to specify the table names corresponding to each class.

Configuring Relationships

To establish a relationship between the Author and Book tables, we use the relationship function provided by SQLAlchemy. In the Author class, we define a relationship named books using relationship("Book", back_populates="author"). Similarly, in the Book class, we define a relationship named author with relationship("Author", back_populates="books").

The back_populates argument establishes bi-directional relationships between the Author and Book classes. It allows us to navigate from an author to their books and vice versa.

Once the relationships are defined, we can easily query related data using SQLAlchemy. For example, to get all the books written by a specific author, we can do:

author = session.query(Author).filter_by(name="John Doe").first()
books = author.books

Similarly, to get the author of a book, we can do:

book = session.query(Book).filter_by(title="The Great Gatsby").first()
author = book.author

By configuring relationships in SQLAlchemy, we can simplify our database interactions and perform complex queries with ease.

Conclusion

In this blog post, we learned how to configure relationships in SQLAlchemy by defining tables and classes, and establishing relationships using the relationship function. We also saw how to query related data using these relationships.

SQLAlchemy’s support for relationships makes it a powerful ORM tool for working with databases in Python. It provides a clean and intuitive API for managing complex database schemas and querying related data.

For more information, refer to the SQLAlchemy documentation and explore the various relationship options it provides. Happy coding!