python SQLAlchemyのMappingとDeclarativeの詳細解
2345 ワード
前に述べたように、VSQLAlchemyのEngineとConnectionは、row SQL(元のsql文)で動作しますが、ORMは対象に向けた思考で表データを操作する技術です。ORMとはPythonオブジェクトからデータテーブルへのマッピング関係です。
以前はSQLAlchemyはどのようにPythonオブジェクトとデータベース内の表のレコードをマッピングしましたか?mapping関数を通して
まず例を見てみます
新しいORMマッピングは、手動でmapping関数を通じてテーブルとクラスの関係を関連付ける必要がなく、直接声明システム(Declarabie)によってクラスを定義することができます。このクラスは直接データベースのテーブルにマッピングされます。declarativeはTable、mapper、そしてこれらの3つをブロックに入れて声明します。これによりORMのマッピングが実現された。例を見ると:
私たちはArticeをマッピングクラスと呼びます。この類はTableとmapper関数の引用を持っています。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。
以前は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は何のために使いますか?テーブルを作成したり、削除したりできます。以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。