Sqlalchemy-orm-building-relationship

提供:Dev Guides
移動先:案内検索

SQLAlchemy ORM-関係の構築

このセッションでは、データベース内の既存のテーブルに関連する別のテーブルの作成について説明します。 得意先テーブルには、得意先のマスタデータが含まれています。 ここで、顧客に属する請求書をいくつでも持つことができる請求書テーブルを作成する必要があります。 これは、1対多の関係の場合です。

宣言を使用して、以下に示すように、マップされたクラスである請求書とともにこのテーブルを定義します-

from sqlalchemy import create_engine, ForeignKey, Column, Integer, String
engine = create_engine('sqlite:///sales.db', echo = True)
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
from sqlalchemy.orm import relationship

class Customer(Base):
   __tablename__ = 'customers'

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

class Invoice(Base):
   __tablename__ = 'invoices'

   id = Column(Integer, primary_key = True)
   custid = Column(Integer, ForeignKey('customers.id'))
   invno = Column(Integer)
   amount = Column(Integer)
   customer = relationship("Customer", back_populates = "invoices")

Customer.invoices = relationship("Invoice", order_by = Invoice.id, back_populates = "customer")
Base.metadata.create_all(engine)

これにより、CREATE TABLEクエリが以下のようにSQLiteエンジンに送信されます-

CREATE TABLE invoices (
   id INTEGER NOT NULL,
   custid INTEGER,
   invno INTEGER,
   amount INTEGER,
   PRIMARY KEY (id),
   FOREIGN KEY(custid) REFERENCES customers (id)
)

SQLiteStudioツールを使用して、sales.dbに新しいテーブルが作成されていることを確認できます。

Sales.db新しいテーブル

請求書クラスは、custid属性にForeignKeyコンストラクトを適用します。 このディレクティブは、この列の値を、customersテーブルのid列に存在する値に制限する必要があることを示します。 これはリレーショナルデータベースのコア機能であり、接続されていないテーブルのコレクションを豊かな重複関係に変換する「接着剤」です。

relationship()として知られる2番目のディレクティブは、属性Invoice.customerを使用してInvoiceクラスをCustomerクラスにリンクする必要があることをORMに伝えます。 relationship()は、2つのテーブル間の外部キー関係を使用して、このリンケージの性質を判断し、多対1であると判断します。

追加のrelationship()ディレクティブは、Customer.invoices属性の下のCustomerマップクラスに配置されます。 パラメーターrelationship.back_populatesは、補完的な属性名を参照するために割り当てられます。これにより、各relationship()は、逆に表現された同じ関係についてインテリジェントな決定を行うことができます。 一方では、Invoices.customerはInvoicesインスタンスを参照し、他方では、Customer.invoicesはCustomerインスタンスのリストを参照します。

関係関数は、SQLAlchemy ORMパッケージの関係APIの一部です。 2つのマップされたクラス間の関係を提供します。 これは、親子関係または関連テーブルの関係に対応します。

以下は、見つかった基本的な関係パターンです-

1対多

1対多の関係は、子テーブルの外部キーを使用して親を参照します。 次に、子で表されるアイテムのコレクションを参照するように、親でrelationship()が指定されます。 relationship.back_populatesパラメーターは、「逆」側が多対1の1対多の双方向関係を確立するために使用されます。

多対一

一方、多対1の関係では、親テーブルに外部キーを配置して子を参照します。 relationship()は親で宣言され、新しいスカラー保持属性が作成されます。 ここでも、relationship.back_populatesパラメーターがBidirectionalbehaviourに使用されます。

一対一

一対一の関係は、本質的に本質的に双方向の関係です。 uselistフラグは、関係の「多」側のコレクションではなく、スカラー属性の配置を示します。 1対多を1対1タイプの関係に変換するには、uselistパラメーターをfalseに設定します。

多対多

多対多の関係は、外部キーで属性を定義することにより、2つのクラスに関連する関連付けテーブルを追加することによって確立されます。 それは、relationship()の2次引数によって示されます。 通常、Tableは宣言的な基本クラスに関連付けられたMetaDataオブジェクトを使用するため、ForeignKeyディレクティブはリンクするリモートテーブルを見つけることができます。 各relationship()のrelationship.back_populatesパラメーターは、双方向の関係を確立します。 関係の両側にはコレクションが含まれます。