按照我對 SQLAlchemy 的理解,其實它的定位大概相似於:sql
然而 Core 部分基本沒有人使用。並且它對使用者暴露了太多 API,這無疑加劇了使用者的心智負擔,可謂之「不友好」。另外,其官方文檔也有點稍顯雜亂,讓初學者抓不住輕重。chrome
SQLAlchemy 使用最多的地方,大概就是與 Flask 的結合了,即 Flask-SQLAlchemy。這就是 SQLAlchemy 的 Wrapper,固然若是咱們沒有使用 Flask,那麼就須要本身封裝一層 Wrapper 了,或者使用別人已經弄好的 Wrapper。bash
至於爲何,如上文所述,SQLAlchemy給使用暴露的API太多,讓人感到無所適從(不過若是使用得熟練了,他仍是很順手的)。session
定義完 Model 以後,立刻咱們就到了業務邏輯這個層次了。app
沒有會把一個 Model 導入到 Controller 層使用,封裝一個 Manager 層是必須的( 若是必要,視業務邏輯複雜性,還可引入更多的層次)。工具
好比(以 Flask 爲例)ui
user_mgr.py
from SomeWhere import db
from models import User
class UserMgr:
@classmethod
def create_user(cls, **kw):
u = User(**kw)
db.session.add(u)
db.session.commit()
return u
@classmethod
def get_user(cls, **kw):
return User.query.filter_by(**kw).first()
複製代碼
上層若是要操做 User,則只經過 UserMgr。google
增刪該查是每個 Model 都會具備的操做,若是每一個 Manager 中都寫一大堆重複的create_xxx, get_xxx
,那很明顯咱們是在Repeat Yourself
。spa
首先咱們會想到使用繼承來解決,定義一個 BaseManager 基類,而後你們都繼承它,整個過程都很符合繼承的思惟直覺。不過我比較偏好寫各類 Utils 來解決,把通用的不變的邏輯放到 Utils 中,而後各個 Manager 將操做轉發到 Utils 中。code
好比:
utils/orm.py
from SomeWhere import db
class OrmUtils:
@classmethod
def create_orm(cls, orm_cls, **kw):
orm = orm_cls(**kw)
db.session.add(orm)
db.session.commit()
return orm
@classmethod
def get_orm(cls, orm_cls, **kw):
return orm_cls.query.filter_by(**kw).first()
@classmethod
def delete_orm(cls, orm):
orm.delete()
db.session.commit()
return True
user_mgr.py
class UserMgr:
@classmethod
def create_user(cls, **kw):
return OrmUtils.create_orm(User, **kw)
複製代碼
我是一個 Django 黨,我對 Django 印象最深入的就是它的 ORM 了,功能完善並且十分強大。可是對 SQLAlchemy 來講,如前文所述,它只不過是一款 Library,天然沒有 Migration 工具。
可是其做者本身也寫了對應的 migration 庫,沒有和 SQLAlchemy 整合到一塊兒(你們能夠Google下)。總的來講,還湊合,可堪一用(天然不能和Django的migration比)。