Python ORM框架SQLAlchemy學(xué)習(xí)筆記之關(guān)系映射實例
昨天簡單介紹了SQLAlchemy的使用,但是沒有能夠涉及其最精彩的ORM部分,今天我將簡單說明一下,當(dāng)然主要還是講解官方文檔的內(nèi)容,由于是學(xué)習(xí)筆記,有可能存在精簡或者自己理解的部分,不做權(quán)威依據(jù)。
當(dāng)我們開始使用ORM,一種可配置的結(jié)構(gòu)可以用于描述我們的數(shù)據(jù)庫表,稍后我們定義的類將會被映射到這些表上。當(dāng)然現(xiàn)代的SQLAlchemy(新版本SQLAlchemy,原文是modern SQLAlchemy)使用Declarative把這兩件事一起做了,即允許我們把創(chuàng)建類和描述定義數(shù)據(jù)庫表以及它們之間的映射關(guān)系一次搞定。
這段話是什么意思呢?簡單來說吧,SQLAlchemy分為Classic (經(jīng)典模式)和Modern (現(xiàn)代模式),Classic定義數(shù)據(jù)庫表的模式比較傳統(tǒng),需要先描述這個表。
1. Classic 映射
比如以官方文檔中的例子,我們擁有表結(jié)構(gòu)如下:
CREATE TABLE [users] (
[id] INTEGER PRIMARY KEY,
[name] TEXT NOT NULL,
[fullname] TEXT NOT NULL,
[password] TEXT NOT NULL
);
下面我們描述這張表:
from sqlalchemy import Table, MetaData, Column, Integer, String
metadata = MetaData()
user = Table('users', metadata,
Column('id', Integer, primary_key=True),
Column('name', String(50)),
Column('fullname', String(50)),
Column('password', String(12))
)
好,這樣我們的表算是描述完成了,接下來我們需要定義我們的Python類,比如這樣的:
class User(object):
def __init__(self, name, fullname, password):
self.name = name
self.fullname = fullname
self.password = password
如何讓我們定義的類與之前描述的表結(jié)構(gòu)發(fā)生映射關(guān)系就是我們接下來要做的:
from sqlalchemy.orm import mapper
mapper(User, user)
大家注意到mapper函數(shù),第一個參數(shù)是我們類的名稱,第二個參數(shù)是我們先前描述的表定義。
這就是傳統(tǒng)的定義ORM的方法,有關(guān)這個方法的更多信息,可以閱讀文檔Mapper Configuration,以后有機會再和大家詳談。
2. Modern 映射
當(dāng)大家都樂此不疲的定義描述表,定義類,再映射來實現(xiàn)ORM的時候,SQLAlchemy團隊搞出了更簡單的映射方法,那就是Modern模式了,即通過定義映射類來一次性完成所有任務(wù)。
為了定義的類能夠被SQLAlchemy管理,所以引入了Declarative這個概念,也就是說我們所有的類必須是Declarative基類的子類,而這個基類可以通過下面的辦法來獲?。?BR>
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
當(dāng)然一個程序內(nèi),這個基類最好是唯一的,建議存儲在全局變量比如Base中供所有映射類使用。
現(xiàn)在通過剛才的代碼我們得到了名為Base的基類,通過這個基類我們可以定義N多的映射子類,而這些子類都能被SQLAlchemy Declarative系統(tǒng)管理到。
下面我們還是看剛才的那個users表的例子:
from sqlalchemy import Column, Integer, String
class User(Base):
__tablename__ = '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 "<User('%s','%s', '%s')>" % (self.name, self.fullname, self.password)
就這段代碼就完成了我們先前在Classic中需要的三步,代碼比原先更簡潔和容易管理了,同剛才Classic中Table定義的Column,這個代表數(shù)據(jù)庫表中的列,當(dāng)然Integer和String代表著數(shù)據(jù)庫表的字段類型了。
這樣User類就建立起與數(shù)據(jù)庫表的映射,真實表的名字可以使用__tablename__指明,然后是表列的集合,包括id、name、fullname以及password,當(dāng)然想必大家已經(jīng)知道了,我們通過primary_key=True已經(jīng)指明id為主鍵了。當(dāng)然一些數(shù)據(jù)庫表可能不包含有主鍵(例如視圖View,當(dāng)然視圖也可以被映射),ORM為了能夠?qū)嶋H映射表需要至少一個列被定義為主鍵列。多列,比如復(fù)合多主鍵也能夠被很好地映射支持。
大家可能注意到User類中還包含有通常意義上的Python魔術(shù)方法,包含__init__()初始化類(構(gòu)造方法)以及__repr__()字符串化支持方法,當(dāng)然這些都是可選的,如果需要這個類可以加入程序所需要的任意多方法或者屬性,你只要把這個類看作一個普通的Python類就可以了。
當(dāng)然User類唯一不能馬虎的就是必須繼承至Base,這個Base就是剛才我們通過declarative_base()生成的類,通過它我們可以接下來讓SQLAlchemy Declarative系統(tǒng)管理并操作這些映射類和數(shù)據(jù)庫表。
實際上包括繼承的Base類,所有的類都應(yīng)該是Python的新式類(new style class),關(guān)于新式類的更多信息可以參考Python手冊。
隨著我們的User映射類通過Declarative系統(tǒng)構(gòu)造成功,我們就擁有了相關(guān)的定義信息,比如在Classic定義中介紹的Table()描述,也包含映射到表的類,就是User自身,我們可以通過User.__table__來查看我們的表描述情況:
>>> User.__table__
Table('users', MetaData(None),
Column('id', Integer(), table=<users>, primary_key=True, nullable=False),
Column('name', String(), table=<users>),
Column('fullname', String(), table=<users>),
Column('password', String(), table=<users>), schema=None)
當(dāng)然找到描述表的數(shù)據(jù)結(jié)構(gòu),也應(yīng)該能找到mapper,我們的Mapper對象可以通過__mapper__屬性來獲取,比如這樣的:
>>> User.__mapper__
<Mapper at 0x...; User>
同樣的MetaData可以通過.metadata屬性找到。
好啦,下面輕松一下,見證奇跡的時刻,我們需不需要定義創(chuàng)建好實體數(shù)據(jù)庫然后再定義ORM?對于SQLAlchemy來說這些都是小事一樁,其都可以給你一手包辦,也就是說你可以完全不必理會數(shù)據(jù)庫,交給SQLAlchemy就可以了,比如通過MetaData.create_all()并將engine參數(shù)傳入即可(什么是engine?參考我的筆記1),比如通過下面的方式創(chuàng)建我們的users表。
>>> Base.metadata.create_all(engine)
PRAGMA table_info("users")
()
CREATE TABLE users (
id INTEGER NOT NULL,
name VARCHAR,
fullname VARCHAR,
password VARCHAR,
PRIMARY KEY (id)
)
()
COMMIT
由于我們開啟了engine的echo=True,所以在交互命令下SQLAlchemy把SQL語句也輸出了,正好可以檢驗是否符合我們的要求。
這樣簡單的create_all()我們就輕松建立起先前ORM映射定義的表啦。
時間不早了,今天先聊到這兒,下次再談SQLAlchemy的其他特性。
- Python的ORM框架SQLAlchemy入門教程
- Python ORM框架SQLAlchemy學(xué)習(xí)筆記之?dāng)?shù)據(jù)添加和事務(wù)回滾介紹
- Python ORM框架SQLAlchemy學(xué)習(xí)筆記之安裝和簡單查詢實例
- Python ORM框架SQLAlchemy學(xué)習(xí)筆記之?dāng)?shù)據(jù)查詢實例
- Python的ORM框架SQLObject入門實例
- python orm 框架中sqlalchemy用法實例詳解
- Python的Django框架中forms表單類的使用方法詳解
- 在Python的Flask中使用WTForms表單框架的基礎(chǔ)教程
- Python ORM編程基礎(chǔ)示例
相關(guān)文章
Python 整行讀取文本方法并去掉readlines換行\(zhòng)n操作
這篇文章主要介紹了Python 整行讀取文本方法并去掉readlines換行\(zhòng)n操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
妙用itchat! python實現(xiàn)久坐提醒功能
python編寫的久坐提醒,給最愛的那個她,這篇文章主要為大家分享了python久坐提醒功能的實現(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-11-11
win10下Python3.6安裝、配置以及pip安裝包教程
下面小編就為大家?guī)硪黄獁in10下Python3.6安裝、配置以及pip安裝包教程。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
Win10系統(tǒng)下安裝編輯器之神(The?God?of?Editor)Vim并且構(gòu)建Python生態(tài)開發(fā)環(huán)境過程(2
這篇文章主要介紹了Win10系統(tǒng)下安裝編輯器之神(The?God?of?Editor)Vim并且構(gòu)建Python生態(tài)開發(fā)環(huán)境(2020年最新攻略),本次我們在Win10平臺構(gòu)建一套以Vim為核心的Python開發(fā)環(huán)境,需要的朋友可以參考下2023-01-01
解決pytorch下只打印tensor的數(shù)值不打印出device等信息的問題
這篇文章主要介紹了解決pytorch下只打印tensor的數(shù)值不打印出device等信息的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05
Python之Matplotlib繪圖調(diào)節(jié)清晰度解決方案
Matplotlib是一個Python的繪圖庫,可以用來繪制各種類型的圖表,包括線圖、散點圖、柱狀圖等等,這篇文章主要給大家介紹了關(guān)于Python之Matplotlib繪圖調(diào)節(jié)清晰度的相關(guān)資料,需要的朋友可以參考下2024-03-03

