- テーブルの定義:
まず、多対多の関係を持つテーブルを定義します。例として、
users
とroles
という2つのテーブルがあるとします。ユーザーは複数の役割を持つことができ、役割も複数のユーザーに関連付けられるとします。
from sqlalchemy import Column, Integer, String, Table, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
user_role_association = Table(
'user_role_association',
Base.metadata,
Column('user_id', Integer, ForeignKey('users.id')),
Column('role_id', Integer, ForeignKey('roles.id'))
)
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
roles = relationship("Role", secondary=user_role_association, back_populates="users")
class Role(Base):
__tablename__ = 'roles'
id = Column(Integer, primary_key=True)
name = Column(String)
users = relationship("User", secondary=user_role_association, back_populates="roles")
- 多対多のJOINクエリの実行: 次に、多対多のJOINクエリを実行する方法を示します。
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()
# ユーザーと役割の情報を取得するクエリ
query = session.query(User, Role).join(user_role_association).join(Role)
# クエリ結果を表示
for user, role in query:
print(f"User: {user.name}, Role: {role.name}")
この例では、User
とRole
をJOINし、関連するユーザーと役割の情報を取得しています。JOINの順序に注意してください。user_role_association
テーブルをJOINし、その後にRole
テーブルをJOINしています。
これは、SQLAlchemyを使用して多対多のJOINクエリを実行する基本的な方法の一例です。必要に応じてフィルタリングや追加のJOIN条件を追加することもできます。
以上が、SQLAlchemyを使用して多対多のJOINクエリを実行する方法の概要です。ご参考までにお使いください。