Sqlalchemy-orm-declaring-mapping
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を開くと、上記の構造を持つ顧客テーブルが表示されます。