CData Python Connector for Cassandra

Build 20.0.7587

Executing JOINs

暗黙的な結合

関連するCassandra オブジェクトのマップされたクラスは、外部キーリレーションシップが単一の場合、暗黙的に結合されます。必要なオブジェクトをインポートすると、以下の例のように、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)
	LastName = 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)
	LastName = Column(String)
	BillingCity = Column(String)
	NumberOfEmployees = Column(Integer)
	Contact_Link = relationship("Contact", order_by=Contact.Id, back_populates="Account_Link")

リレーションシップが確立されると、以下のように、セッションの"query()" メソッドを使用してテーブルが同時にクエリされます。

for Ac, Ct in session.query(Account, Contact).filter(Account.Id == Contact.AccountId):
  print("AccountId: ", Ac.Id)
  print("AccountName: ", Ac.Name)
  print("ContactId: ", Ct.Id)
  print("ContactLastName: ", Ct.LastName)

他の結合形式

マップされたクラスに外部キーがないか、複数の外部キーがある場合があります。そのような状況では、それらに対応するために、異なる形式のJOIN クエリが必要になるかもしれません。先ほどのクラスを例にすると、以下のJOIN クエリも可能です。

  • 明示的な条件(マップされたクラスに外部キーがない場合に必要):
    for Ac, Ct in session.query(Account, Contact).join(Contact, Account.Id == Contact.AccountId)
  • 左から右へのリレーションシップ:
    for Ac, Ct in session.query(Account, Contact).join(Account.Contact_Link)
  • 明示的なターゲットがある左から右へのリレーションシップ:
    for Ac, Ct in session.query(Account, Contact).join(Contact, Account.Contact_Link)
  • 文字列形式の左から右へのリレーションシップ:
    for Ac, Ct in session.query(Account, Contact).join("Contact_Link")

Copyright (c) 2020 CData Software, Inc. - All rights reserved.
Build 20.0.7587