當我們開始使用ORM,一種可配置的結構可以用于描述我們的數據庫表,稍后我們定義的類將會被映射到這些表上。當然現代的SQLAlchemy(新版本SQLAlchemy,原文是modern SQLAlchemy)使用Declarative把這兩件事一起做了,即允許我們把創建類和描述定義數據庫表以及它們之間的映射關系一次搞定。
這段話是什么意思呢?簡單來說吧,SQLAlchemy分為Classic (經典模式)和Modern (現代模式),Classic定義數據庫表的模式比較傳統,需要先描述這個表。
1. Classic 映射
比如以官方文檔中的例子,我們擁有表結構如下:
代碼如下:
下面我們描述這張表:
代碼如下:
metadata = MetaData()
user = Table('users', metadata,
Column('id', Integer, primary_key=True),
Column('name', String(50)),
Column('fullname', String(50)),
Column('password', String(12))
)
這就是傳統的定義ORM的方法,有關這個方法的更多信息,可以閱讀文檔Mapper Configuration,以后有機會再和大家詳談。
2. Modern 映射
當大家都樂此不疲的定義描述表,定義類,再映射來實現ORM的時候,SQLAlchemy團隊搞出了更簡單的映射方法,那就是Modern模式了,即通過定義映射類來一次性完成所有任務。
為了定義的類能夠被SQLAlchemy管理,所以引入了Declarative這個概念,也就是說我們所有的類必須是Declarative基類的子類,而這個基類可以通過下面的辦法來獲?。?BR> 代碼如下:
現在通過剛才的代碼我們得到了名為Base的基類,通過這個基類我們可以定義N多的映射子類,而這些子類都能被SQLAlchemy Declarative系統管理到。
下面我們還是看剛才的那個users表的例子:
代碼如下:
id = Column(Integer, primary_key=True)
name = Column(String)
fullname = Column(String)
password = Column(String)
def __init__(self, name, fullname, password):
self.name = name
self.fullname = fullname
self.password = password
def __repr__(self):
return "" % (self.name, self.fullname, self.password)
這樣User類就建立起與數據庫表的映射,真實表的名字可以使用__tablename__指明,然后是表列的集合,包括id、name、fullname以及password,當然想必大家已經知道了,我們通過primary_key=True已經指明id為主鍵了。當然一些數據庫表可能不包含有主鍵(例如視圖View,當然視圖也可以被映射),ORM為了能夠實際映射表需要至少一個列被定義為主鍵列。多列,比如復合多主鍵也能夠被很好地映射支持。
大家可能注意到User類中還包含有通常意義上的Python魔術方法,包含__init__()初始化類(構造方法)以及__repr__()字符串化支持方法,當然這些都是可選的,如果需要這個類可以加入程序所需要的任意多方法或者屬性,你只要把這個類看作一個普通的Python類就可以了。
當然User類唯一不能馬虎的就是必須繼承至Base,這個Base就是剛才我們通過declarative_base()生成的類,通過它我們可以接下來讓SQLAlchemy Declarative系統管理并操作這些映射類和數據庫表。
實際上包括繼承的Base類,所有的類都應該是Python的新式類(new style class),關于新式類的更多信息可以參考Python手冊。
隨著我們的User映射類通過Declarative系統構造成功,我們就擁有了相關的定義信息,比如在Classic定義中介紹的Table()描述,也包含映射到表的類,就是User自身,我們可以通過User.__table__來查看我們的表描述情況:
代碼如下:
好啦,下面輕松一下,見證奇跡的時刻,我們需不需要定義創建好實體數據庫然后再定義ORM?對于SQLAlchemy來說這些都是小事一樁,其都可以給你一手包辦,也就是說你可以完全不必理會數據庫,交給SQLAlchemy就可以了,比如通過MetaData.create_all()并將engine參數傳入即可(什么是engine?參考我的筆記1),比如通過下面的方式創建我們的users表。
代碼如下:
這樣簡單的create_all()我們就輕松建立起先前ORM映射定義的表啦。
時間不早了,今天先聊到這兒,下次再談SQLAlchemy的其他特性。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com