[파이썬] SQLAlchemy JOIN 연산

SQLAlchemy is a powerful SQL toolkit and Object-Relational Mapping (ORM) library for Python. It provides a wide range of tools and functionality for working with databases.

One of the key features of SQLAlchemy is its ability to perform JOIN operations on tables. JOIN operations are used to combine rows from multiple tables based on a common column between them.

In this blog post, we will explore how to perform JOIN operations using SQLAlchemy in Python.

Setting up the Environment

Before we can start working with SQLAlchemy, we need to set up our environment. First, let’s install SQLAlchemy using pip:

pip install SQLAlchemy

Next, we need to import the necessary modules:

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

Defining the Database Structure

To demonstrate the JOIN operations, let’s define a simple database structure with two tables: Author and Book. Each Author can have multiple Book entries.

Base = declarative_base()

class Author(Base):
    __tablename__ = 'author'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    books = relationship('Book', back_populates='author')

class Book(Base):
    __tablename__ = 'book'
    id = Column(Integer, primary_key=True)
    title = Column(String)
    author_id = Column(Integer, ForeignKey('author.id'))
    author = relationship('Author', back_populates='books')

In this example, the Author table has a one-to-many relationship with the Book table defined by the author_id foreign key.

Performing JOIN Operations

Inner Join

An inner join returns only the rows that have matching records in both tables.

engine = create_engine('sqlite:///database.db')
Session = sessionmaker(bind=engine)
session = Session()

# Perform inner join
query = session.query(Author, Book).filter(Author.id == Book.author_id).all()

# Print the result
for author, book in query:
    print(author.name, book.title)

Outer Join

An outer join returns all rows from both tables, with NULL values for non-matching records.

# Perform outer join
query = session.query(Author, Book).outerjoin(Book, Author.id == Book.author_id).all()

# Print the result
for author, book in query:
    if book is None:
        print(author.name, 'No books')
    else:
        print(author.name, book.title)

Left Join

A left join returns all rows from the left table and the matching rows from the right table. NULL values are used for non-matching records in the right table.

# Perform left join
query = session.query(Author, Book).join(Book, Author.id == Book.author_id, isouter=True).all()

# Print the result
for author, book in query:
    if book is None:
        print(author.name, 'No books')
    else:
        print(author.name, book.title)

Right Join

A right join returns all rows from the right table and the matching rows from the left table. NULL values are used for non-matching records in the left table.

# Perform right join
query = session.query(Author, Book).join(Book, Author.id == Book.author_id, full=False).all()

# Print the result
for author, book in query:
    print(author.name, book.title)

Conclusion

SQLAlchemy provides a versatile and powerful way to perform JOIN operations in Python. We can use inner, outer, left, or right joins to combine rows from multiple tables based on a common column.

By leveraging the capabilities of SQLAlchemy, we can easily work with databases and perform complex data manipulations with ease.

In this blog post, we covered the basics of performing JOIN operations using SQLAlchemy. Experiment with different join types and explore the full potential of SQLAlchemy in your Python projects.