python SQLAlchemyのMappingとDeclarativeの詳細解


前に述べたように、VSQLAlchemyのEngineとConnectionは、row SQL(元のsql文)で動作しますが、ORMは対象に向けた思考で表データを操作する技術です。ORMとはPythonオブジェクトからデータテーブルへのマッピング関係です。
以前はSQLAlchemyはどのようにPythonオブジェクトとデータベース内の表のレコードをマッピングしましたか?mapping関数を通して
まず例を見てみます

from sqlalchemy import Table, MetaData, Column, Integer, String,
from sqlalchemy.orm import mapper

#        ,           ,         
metadata = MetaData()

#      news_article 
article = Table("news_article", metadata,
        Column("id", Integer, primary_key=True),
        Column("title", String)
        )

#        Article 
class Article:
  def __init__(self, title):
    self.title = title

#   mapper        
mapper(Article, article)
関連したらどう使いますか?例を見ます

from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()
#   Artcile    id==4554   ,              sql 
#       Article     
result = session.query(Article).filter(Article.id==4554).first()
print(result.id) # 4554
print(result.title) # xxxxxxxxx
mapper関数をマッピングした後、queryで検索して返した結果、自動的に返した結果をArtcleオブジェクトに構成し、id属性を持つというのがORMの魔力のありかです。
新しいORMマッピングは、手動でmapping関数を通じてテーブルとクラスの関係を関連付ける必要がなく、直接声明システム(Declarabie)によってクラスを定義することができます。このクラスは直接データベースのテーブルにマッピングされます。declarativeはTable、mapper、そしてこれらの3つをブロックに入れて声明します。これによりORMのマッピングが実現された。例を見ると:

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Article(Base):
  __tablename__ = 'news_article'
  id = Column(Integer, primary_key=True)
  title = Column(String(50))
簡単ではないですか?Tableの定義がなくて、mapper関数がなくて、一つの種類の定義しかありません。この種類はベースベースベースベースベースベースベースベースベースを継承しなければなりません。Baseは私達の声明システムです。このようにTableとクラスのマッピング関係を完成しました。後ろの操作は全部declarabieを通じています。ベース工場の方法構造の声明システムが完成しました。
私たちはArticeをマッピングクラスと呼びます。この類はTableとmapper関数の引用を持っています。

>>> print(Article.__table__)
news_article

>>>print(Article.__mapper__)
Mapper|Article|news_article

#     metadata      Base   
>>>print(Base.metadata)
MetaData(bind=None)
Metadataは何のために使いますか?テーブルを作成したり、削除したりできます。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。