ホームページ  >  記事  >  バックエンド開発  >  Python ORM フレームワーク SQLAlchemy の学習メモの関係マッピングの例

Python ORM フレームワーク SQLAlchemy の学習メモの関係マッピングの例

WBOY
WBOYオリジナル
2016-06-16 08:43:501205ブラウズ

昨日は SQLAlchemy の使い方を簡単に紹介しましたが、最も興味深い ORM の部分については触れていませんでした。もちろん、公式ドキュメントの内容を中心に説明します。単純化や自己理解の部分があるかもしれませんが、権威ある根拠としては機能しません。

ORM の使用を開始すると、構成可能な構造を使用してデータベース テーブルを記述することができ、後で定義するクラスがこれらのテーブルにマップされます。もちろん、最新の SQLAlchemy (SQLAlchemy の新しいバージョン、原文は modern SQLAlchemy) はこれら 2 つのことを一緒に行うために宣言型を使用します。これにより、クラスの作成、データベース テーブルの記述と定義、およびそれらの間のマッピング関係を一度に行うことができます。

この一節はどういう意味ですか?簡単に言うと、SQLAlchemy は Classic (クラシック モード) と Modern (モダン モード) に分かれており、データベース テーブルを定義するための Classic のモードはより伝統的であり、最初にテーブルを記述する必要があります。

1. クラシックマッピング

たとえば、公式ドキュメントの例を見ると、次のテーブル構造があります:

コードをコピー コードは次のとおりです:

CREATE TABLE [users] (
[id] INTEGER PRIMARY KEY、
[name] TEXT NOT NULL、
[fullname] TEXT NOT NULL、
[password] TEXT NOT NULL
);

以下でこのテーブルについて説明します。

コードをコピーします コードは次のとおりです:

from sqlalchemy import テーブル、 MetaData, Column , Integer, String

metadata = MetaData()

user = Table('users', metadata,
Column('name',文字列(50)),
Column('fullname', String(50)),
Column('password', String(12))
)
さて、これでテーブルの説明は完了です。次のような Python クラスを定義します:

コードをコピーします コードは次のとおりです:
class User(object ):
def __init__(self, name, fullname,password):
self.name = name
self.fullname = fullname
self.password =password
マッピング方法前に説明したテーブル構造に定義したクラスが次に行うべきことです:

コードをコピー コードは次のとおりです:
sqlalchemy.orm インポート マッパーから
mapper(User, user)
マッパー関数の最初のパラメーターがクラスの名前であり、2 番目のパラメーターが説明したテーブル定義であることに誰もが気づきました。以前。
これは ORM を定義する伝統的な方法です。この方法の詳細については、将来機会があれば詳しく説明するドキュメント「Mapper Configuration」を参照してください。

2. 最新のマッピング

誰もが延々と説明テーブルを定義し、クラスを定義し、ORM を実装するためにマッピングを行っているとき、SQLAlchemy チームは、モダン モードであるより単純なマッピング方法を考え出しました。つまり、マッピング クラスを定義してすべてを完了することによって、一度のタスク。

定義されたクラスを SQLAlchemy で管理するには、宣言型の概念が導入されます。これは、すべてのクラスが宣言型基本クラスのサブクラスである必要があり、この基本クラスは次のメソッドを通じて取得できることを意味します。


コードをコピーします コードは次のとおりです:
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
もちろん、この基本クラスはプログラム内で一意である必要があり、すべてのマッピング クラスで使用できるように、Base などのグローバル変数に格納することをお勧めします。
先ほどのコードを通じて、Base という名前の基本クラスを取得します。この基本クラスを通じて、N 個のマッピング サブクラスを定義でき、これらのサブクラスは SQLAlchemy 宣言システムで管理できます。

今の users テーブルの例を見てみましょう:


コードをコピーします コードは次のとおりです:

from sqlalchemy import Column, Integer, String
class User(Base):
__tablename__ = 'users'

id = Column(Integer, Primary_key=True)
名前 = 列(文字列)
フルネーム = 列(文字列)
パスワード = 列(文字列)

def __init__(自己, 名前, フルネーム, パスワード):
self.name = 名前
self.fullname = フルネーム
self.password = パスワード

def __repr__(self):
return "" % (self.name, self.fullname, self.password)
このコードだけで、以前 Classic で必要だった 3 つの手順が完了しました。コードは、はい、先ほどクラシックのテーブルで定義した列と同じです。もちろん、Integer と String はデータベース テーブルのフィールドの型を表します。

このようにして、User クラスは __tablename__ を使用してデータベース テーブルとのマッピングを確立し、その後、ID、名前、フルネーム、パスワードを含むテーブル列のコレクションを指定できます。誰もがすでに知っているはずです。id は、primary_key=True によって主キーとして指定されています。もちろん、一部のデータベース テーブルには主キーが含まれていない場合があります (ビューなど、もちろんビューもマップできます)。ORM が実際にテーブルをマップするには、少なくとも 1 つの列を主キー列として定義する必要があります。 。複合複数主キーなどの複数の列も適切にマッピングしてサポートできます。

User クラスには、__init__() 初期化クラス (コンストラクター メソッド) や __repr__() 文字列化サポート メソッドなど、通常の意味での Python マジック メソッドも含まれていることに気づくかもしれません。もちろん、これらは必要に応じてオプションです。このクラスを通常の Python クラスとして扱うだけで、プログラムに必要なだけメソッドや属性を追加できます。

もちろん、User クラスに関して注意を払うことができないのは、Base から継承する必要があるということです。この Base は、declarative_base() を通じて生成したクラスであり、それを通じて SQLAlchemy Declarative システムに管理させることができます。これらのマッピング クラスとデータベース テーブルを操作します。

実際、継承された Base クラスを含め、すべてのクラスは Python の新しいスタイル クラスである必要があります。新しいスタイル クラスの詳細については、Python マニュアルを参照してください。

User マッピング クラスは宣言型システムを通じて正常に構築されるため、クラシック定義で導入された Table() 記述などの関連する定義情報が得られます。これには、テーブルにマップされたクラス (User 自体) も含まれます。 User.__table__ を通じてテーブルの説明を表示できます。

コードをコピーします コードは次のとおりです。 > > User.__table__ Table('users', MetaData(None),
Column('id', Integer(), table=, main_key=True, nullable=False),
Column('name', String(), table=),
Column('fullname', String(), table=),
Column('password' , String (), table=), schema=None)

もちろん、テーブルを記述するデータ構造が見つかった場合は、Mapper オブジェクトも見つけることができるはずです。


コードをコピー
コードは次のとおりです。 >> > User.__mapper__

同じメタデータは .metadata 属性で見つけることができます。
それでは、落ち着いて奇跡の瞬間を目撃しましょう。エンティティ データベースを定義して作成してから、ORM を定義する必要がありますか? SQLAlchemy の場合、これらはすべて些細な問題であり、SQLAlchemy がすべて処理します。つまり、データベースを完全に無視して、たとえば MetaData.create_all() を介してエンジン パラメーターを渡すだけで済みます。 (エンジンとは何ですか? 私のメモ 1 を参照してください) たとえば、次の方法で users テーブルを作成します。


コードをコピーします

コードは次のとおりです:>>> Base.metadata.create_all(engine) PRAGMA table_info("users")
()
CREATE TABLE users (
id INTEGER NOT NULL、
name VARCHAR、
fullname VARCHAR、
パスワード VARCHAR、
PRIMARY KEY ( id)
)
()
COMMIT

エンジンの echo=True をオンにしたため、SQLAlchemy は対話型コマンドで SQL ステートメントも出力します。弊社の要件に一致するかどうかを確認するために使用されます。
このような単純な create_all() を使用すると、前の ORM マッピングで定義されたテーブルを簡単に作成できます。
もう遅くなりました。今日の話はここでやめて、次回は SQLAlchemy の他の機能について話しましょう。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。