Sqlalchemy-orm-declaring-mapping

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

SQLAlchemy ORM-マッピングの宣言

SQLAlchemyのオブジェクトリレーショナルマッパーAPIの主な目的は、ユーザー定義のPythonクラスをデータベーステーブルに関連付け、それらのクラスのオブジェクトを対応するテーブルの行に関連付けることです。 オブジェクトと行の状態の変化は、互いに同期的に一致します。 SQLAlchemyを使用すると、ユーザー定義のクラスと定義された関係の観点からデータベースクエリを表現できます。

ORMは、SQL式言語の上に構築されます。 これは、高レベルで抽象化された使用パターンです。 実際、ORMは式言語の適用された使用法です。

成功したアプリケーションは、オブジェクトリレーショナルマッパーのみを使用して構築できますが、ORMを使用して構築したアプリケーションでは、特定のデータベースとのやり取りが必要な場合に、式言語を直接使用できます。

マッピングを宣言する

まず、create_engine()関数を呼び出してエンジンオブジェクトを設定し、その後でSQL操作を実行するために使用します。 この関数には2つの引数があります。1つはデータベースの名前で、もう1つはTrueに設定された場合のエコーパラメーターであり、アクティビティログを生成します。 存在しない場合、データベースが作成されます。 次の例では、SQLiteデータベースが作成されます。

from sqlalchemy import create_engine
engine = create_engine('sqlite:///sales.db', echo = True)

Engine.execute()やEngine.connect()などのメソッドが呼び出されると、エンジンはデータベースへの実際のDBAPI接続を確立します。 次に、エンジンを直接使用しないSQLORMを発行するために使用されます。代わりに、ORMによって舞台裏で使用されます。

ORMの場合、構成プロセスは、データベーステーブルを記述してから、それらのテーブルにマッピングされるクラスを定義することから始まります。 SQLAlchemyでは、これら2つのタスクは一緒に実行されます。 これは、宣言システムを使用して行われます。作成されたクラスには、マップ先の実際のデータベーステーブルを記述するディレクティブが含まれます。

基本クラスは、宣言システムのクラスとマップされたテーブルのカタログを保存します。 これは、宣言ベースクラスと呼ばれます。 通常、一般的にインポートされるモジュールには、このベースのインスタンスが1つだけあります。 declarative_base()関数は、基本クラスを作成するために使用されます。 この関数は、sqlalchemy.ext.declarativeモジュールで定義されています。

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

基底クラスが宣言されると、マッピングされたクラスをいくつでも定義できます。 次のコードは、顧客のクラスを定義します。 マッピングされるテーブルと、その中の列の名前とデータ型が含まれます。

class Customers(Base):
   __tablename__ = 'customers'

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

Declarativeのクラスには、 tablename 属性と、主キーの一部である少なくとも1つの Column が必要です。 宣言は、すべての Column オブジェクトを descriptors として知られる特別なPythonアクセサーに置き換えます。 このプロセスはインストルメンテーションと呼ばれ、SQLコンテキストでテーブルを参照する手段を提供し、データベースから列の値を永続化してロードできるようにします。

通常のPythonクラスのようなこのマッピングされたクラスには、要件に従って属性とメソッドがあります。

宣言システムのクラスに関する情報は、テーブルメタデータと呼ばれます。 SQLAlchemyは、Tableオブジェクトを使用して、宣言によって作成された特定のテーブルのこの情報を表します。 Tableオブジェクトは仕様に従って作成され、Mapperオブジェクトを作成することでクラスに関連付けられます。 このマッパーオブジェクトは直接使用されませんが、マップされたクラスとテーブルの間のインターフェイスとして内部的に使用されます。

各Tableオブジェクトは、MetaDataと呼ばれるより大きなコレクションのメンバーであり、このオブジェクトは、宣言ベースクラスの .metadata 属性を使用して使用できます。 * MetaData.create_all()*メソッドは、データベース接続のソースとしてエンジンを渡します。 まだ作成されていないすべてのテーブルに対して、データベースに対してCREATE TABLEステートメントを発行します。

Base.metadata.create_all(engine)

データベースとテーブルを作成し、Pythonクラスをマップするための完全なスクリプトを以下に示します-

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

class Customers(Base):
   __tablename__ = 'customers'
   id = Column(Integer, primary_key=True)

   name = Column(String)
   address = Column(String)
   email = Column(String)
Base.metadata.create_all(engine)

実行されると、Pythonコンソールは実行されている次のSQL式をエコーし​​ます-

CREATE TABLE customers (
   id INTEGER NOT NULL,
   name VARCHAR,
   address VARCHAR,
   email VARCHAR,
   PRIMARY KEY (id)
)

SQLiteStudioグラフィックツールを使用してSales.dbを開くと、上記の構造を持つ顧客テーブルが表示されます。

顧客テーブル