您好,登錄后才能下訂單哦!
前面介紹過vSQLAlchemy中的 Engine 和 Connection,這兩個對象用在row SQL (原生的sql語句)上操作,而 ORM(Object Relational Mapper)則是一種用面向對象的思維來操作表數據的技術。所謂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查詢返回的結果,會自動將返回結果構造成一個Article對象,并擁有了id 屬性,這就是ORM的魔力所在。
而新的ORM映射不需要手動通過mapping函數來關聯table與類之間的關系,可以直接通過聲明(Declarative )系統(我不知道這樣翻譯對不對)來定義一個類,這個類會直接映射到數據庫的表,declarative 把 Table、mapper、還有類這三者放在一塊進行聲明,從而實現了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,Base 就是我們的聲明系統,這樣就完成了Table與類之間的映射關系,而背后的操作都是通過一個declarative_base 工廠方法構造的聲明系統完成的。
我們把 Article 又稱之為映射類,這個類持有 Table 和 mapper 函數的引用。
>>> print(Article.__table__) news_article >>>print(Article.__mapper__) Mapper|Article|news_article # 前面將的metadata 可以通過 Base 獲取 >>>print(Base.metadata) MetaData(bind=None)
MetaData 有什么用的?可以通過它來創建表或者刪除表。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。