最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python SQLAlchemy的Mapping與Declarative詳解

 更新時(shí)間:2019年07月04日 10:44:35   作者:FOOFISH-PYTHON之禪  
這篇文章主要介紹了python SQLAlchemy的Mapping與Declarative詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

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

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

先來(lái)看個(gè)例子:

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

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

# 數(shù)據(jù)庫(kù)中的news_article表
article = Table("news_article", metadata,
        Column("id", Integer, primary_key=True),
        Column("title", String)
        )

# 這是一個(gè)普通的Article類
class Article:
  def __init__(self, title):
    self.title = title

# 通過(guò)mapper函數(shù)進(jìn)行映射關(guān)聯(lián)
mapper(Article, article)

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

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

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

而新的ORM映射不需要手動(dòng)通過(guò)mapping函數(shù)來(lái)關(guān)聯(lián)table與類之間的關(guān)系,可以直接通過(guò)聲明(Declarative )系統(tǒng)(我不知道這樣翻譯對(duì)不對(duì))來(lái)定義一個(gè)類,這個(gè)類會(huì)直接映射到數(shù)據(jù)庫(kù)的表,declarative 把 Table、mapper、還有類這三者放在一塊進(jìn)行聲明,從而實(shí)現(xiàn)了ORM的映射。來(lái)看例子:

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))

是不是簡(jiǎn)單很多了,沒(méi)有了Table的定義,沒(méi)有mapper函數(shù),只有一個(gè)類的定義,這個(gè)類必須繼承基類 Base,Base 就是我們的聲明系統(tǒng),這樣就完成了Table與類之間的映射關(guān)系,而背后的操作都是通過(guò)一個(gè)declarative_base 工廠方法構(gòu)造的聲明系統(tǒng)完成的。

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

>>> print(Article.__table__)
news_article

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

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

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

大城县| 科尔| 临西县| 稷山县| 金门县| 吉木萨尔县| 柘荣县| 大姚县| 吴堡县| 罗定市| 罗甸县| 略阳县| 招远市| 固安县| 井研县| 安庆市| 安新县| 湖北省| 和顺县| 康马县| 柳河县| 自贡市| 邯郸市| 确山县| 顺义区| 利津县| 临泽县| 清远市| 浪卡子县| 乐安县| 阿克陶县| 泰宁县| 湘阴县| 从江县| 本溪| 扎鲁特旗| 柳州市| 梅州市| 个旧市| 江孜县| 大姚县|