Executing JOINs
暗黙的な結合
関連するJira オブジェクトのマップされたクラスは、外部キーリレーションシップが単一の場合、暗黙的に結合されます。必要なオブジェクトをインポートすると、以下の例のように、2つのマップされたクラス間にリレーションシップが確立されます。
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, String, Integer, DateTime, ForeignKey from sqlalchemy.orm import sessionmaker, relationship Base = declarative_base() class Contact(Base): __tablename__ = "Contact" Id = Column(Integer, primary_key=True) Name = Column(String) Email = Column(String) BirthDate = Column(DateTime) AccountId = Column(String, ForeignKey("Account.Id")) Account_Link = relationship("Account", back_populates="Contact_Link") class Account(Base): __tablename__ = "Account" Id = Column(String, primary_key=True) Name = Column(String) BillingCity = Column(String) NumberOfEmployees = Column(Integer) Contact_Link = relationship("Contact", order_by=Contact.Id, back_populates="Account_Link")
リレーションシップが確立されると、以下のように、セッションの"query()" メソッドを使用してテーブルが同時にクエリされます。
rs = session.query(Account, Contact).filter(Account.Id == Contact.AccountId) for Ac, Ct in rs: print("AccountId: ", Ac.Id) print("AccountName: ", Ac.Name) print("ContactId: ", Ct.Id) print("ContactName: ", Ct.Name)
他の結合形式
マップされたクラスに外部キーがないか、複数の外部キーがある場合があります。そのような状況では、それらに対応するために、異なる形式のJOIN クエリが必要になるかもしれません。先ほどのクラスを例にすると、以下のJOIN クエリも可能です。
- 明示的な条件(マップされたクラスに外部キーがない場合に必要):
rs = session.query(Account, Contact).join(Contact, Account.Id == Contact.AccountId) for Ac, Ct in rs:
- 左から右へのリレーションシップ:
rs = session.query(Account, Contact).join(Account.Contact_Link) for Ac, Ct in rs:
- 明示的なターゲットがある左から右へのリレーションシップ:
rs = session.query(Account, Contact).join(Contact, Account.Contact_Link) for Ac, Ct in rs:
- 文字列形式の左から右へのリレーションシップ:
rs = session.query(Account, Contact).join("Contact_Link") for Ac, Ct in rs: