python SQLAlchemy的Mapping與Declarative詳解
前面介紹過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ù)庫中表里面的每條記錄進(jìn)行映射的呢?通過一個mapping函數(shù)
先來看個例子:
from sqlalchemy import Table, MetaData, Column, Integer, String,
from sqlalchemy.orm import mapper
# 數(shù)據(jù)庫的元數(shù)據(jù),你可以認(rèn)為它是一個容器,裝載了所有的表結(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ù)進(jìn)行映射關(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的實(shí)例對象 result = session.query(Article).filter(Article.id==4554).first() print(result.id) # 4554 print(result.title) # xxxxxxxxx
mapper 函數(shù)進(jìn)行映射后,通過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、還有類這三者放在一塊進(jìn)行聲明,從而實(shí)現(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)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 基于sqlalchemy對mysql實(shí)現(xiàn)增刪改查操作
- 基于SQLAlchemy實(shí)現(xiàn)操作MySQL并執(zhí)行原生sql語句
- python數(shù)據(jù)庫操作mysql:pymysql、sqlalchemy常見用法詳解
- python orm 框架中sqlalchemy用法實(shí)例詳解
- python使用SQLAlchemy操作MySQL
- Python SQLAlchemy入門教程(基本用法)
- python SQLAlchemy 中的Engine詳解
- Python流行ORM框架sqlalchemy安裝與使用教程
- python 獲取sqlite3數(shù)據(jù)庫的表名和表字段名的實(shí)例
- Python_查看sqlite3表結(jié)構(gòu),查詢語句的示例代碼
- python使用sqlite3時游標(biāo)使用方法
- Python SQLite3簡介
- Python使用flask框架操作sqlite3的兩種方式
- python與sqlite3實(shí)現(xiàn)解密chrome cookie實(shí)例代碼
- Python SQLite3數(shù)據(jù)庫日期與時間常見函數(shù)用法分析
- Python實(shí)現(xiàn)讀取TXT文件數(shù)據(jù)并存進(jìn)內(nèi)置數(shù)據(jù)庫SQLite3的方法
- Python開發(fā)SQLite3數(shù)據(jù)庫相關(guān)操作詳解【連接,查詢,插入,更新,刪除,關(guān)閉等】
- Python sqlite3事務(wù)處理方法實(shí)例分析
- Python簡單操作sqlite3的方法示例
- Python3+SQLAlchemy+Sqlite3實(shí)現(xiàn)ORM教程
相關(guān)文章
Python實(shí)現(xiàn)爬取需要登錄的網(wǎng)站完整示例
這篇文章主要介紹了Python實(shí)現(xiàn)爬取需要登錄的網(wǎng)站,結(jié)合完整實(shí)例形式分析了Python登陸網(wǎng)站及數(shù)據(jù)抓取相關(guān)操作技巧,需要的朋友可以參考下2017-08-08
詳解Python+Pyecharts實(shí)現(xiàn)漏斗圖的繪制
漏斗圖是一個簡單的散點(diǎn)圖,反映研究在一定樣本量或精確性下單個研究的干預(yù)效應(yīng)估計值。本文將用Python Pyecharts實(shí)現(xiàn)漏斗圖的繪制,需要的可以參考一下2022-06-06
從源碼解析Python的Flask框架中request對象的用法
Flask中的request對象發(fā)送請求使用起來十分方便,但也有一些需要注意的地方,這里我們來從源碼解析Python的Flask框架中request對象的用法,需要的朋友可以參考下.2016-06-06
詳解NumPy中的線性關(guān)系與數(shù)據(jù)修剪壓縮
本文將通過股票均線計算的案例來為大家講解一下NumPy中的線性關(guān)系以及數(shù)據(jù)修剪壓縮的實(shí)現(xiàn),文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-05-05
Python 實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)-循環(huán)隊(duì)列的操作方法
這篇文章主要介紹了Python 實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)-循環(huán)隊(duì)列的操作方法,需要的朋友可以參考下2019-07-07
Python+Selenium隨機(jī)生成手機(jī)驗(yàn)證碼并檢查頁面上是否彈出重復(fù)手機(jī)號碼提示框
這篇文章主要介紹了Python+Selenium隨機(jī)生成手機(jī)驗(yàn)證碼并檢查頁面上是否彈出重復(fù)手機(jī)號碼提示框,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09
python實(shí)現(xiàn)數(shù)據(jù)預(yù)處理之填充缺失值的示例
下面小編就為大家分享一篇python實(shí)現(xiàn)數(shù)據(jù)預(yù)處理之填充缺失值的示例。具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12

