溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python SQLAlchemy的Mapping與Declarative詳解

發(fā)布時間:2020-10-22 20:52:02 來源:腳本之家 閱讀:141 作者:FOOFISH-PYTHON之禪 欄目:開發(fā)技術(shù)

前面介紹過vSQLAlchemy中的 Engine 和 Connection,這兩個對象用在row SQL (原生的sql語句)上操作,而 ORM(Object Relational Mapper)則是一種用面向?qū)ο蟮乃季S來操作表數(shù)據(jù)的技術(shù)。所謂ORM 就是Python 對象到數(shù)據(jù)表的一種映射關(guān)系。

以前 SQLAlchemy 是怎么把Python對象和數(shù)據(jù)庫中表里面的每條記錄進行映射的呢?通過一個mapping函數(shù)

先來看個例子:

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

# 數(shù)據(jù)庫的元數(shù)據(jù),你可以認為它是一個容器,裝載了所有的表結(jié)構(gòu)
metadata = MetaData()

# 數(shù)據(jù)庫中的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函數(shù)進行映射關(guān)聯(lián)
mapper(Article, article)

關(guān)聯(lián)后怎么使用呢?看例子:

from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()
# 通過Artcile類來查詢id==4554的記錄,這完全是用面向?qū)ο蟮姆绞綀?zhí)行sql了
# 返回結(jié)果就是Article的實例對象
result = session.query(Article).filter(Article.id==4554).first()
print(result.id) # 4554
print(result.title) # xxxxxxxxx

mapper 函數(shù)進行映射后,通過query查詢返回的結(jié)果,會自動將返回結(jié)果構(gòu)造成一個Article對象,并擁有了id 屬性,這就是ORM的魔力所在。

而新的ORM映射不需要手動通過mapping函數(shù)來關(guān)聯(lián)table與類之間的關(guān)系,可以直接通過聲明(Declarative )系統(tǒng)(我不知道這樣翻譯對不對)來定義一個類,這個類會直接映射到數(shù)據(jù)庫的表,declarative 把 Table、mapper、還有類這三者放在一塊進行聲明,從而實現(xiàn)了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函數(shù),只有一個類的定義,這個類必須繼承基類 Base,Base 就是我們的聲明系統(tǒng),這樣就完成了Table與類之間的映射關(guān)系,而背后的操作都是通過一個declarative_base 工廠方法構(gòu)造的聲明系統(tǒng)完成的。

我們把 Article 又稱之為映射類,這個類持有 Table 和 mapper 函數(shù)的引用。

>>> print(Article.__table__)
news_article

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

# 前面將的metadata 可以通過 Base 獲取
>>>print(Base.metadata)
MetaData(bind=None)

MetaData 有什么用的?可以通過它來創(chuàng)建表或者刪除表。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI