SQLAlchemy 最佳實踐

儘可能使用其 Wrapper

按照我對 SQLAlchemy 的理解,其實它的定位大概相似於:sql

  1. 一款比較偏底層 ORM lib
  2. 提供了一些基礎了 ORM 功能,包括 SQLAlchemy Core 和 SQLAlchemy ORM

然而 Core 部分基本沒有人使用。並且它對使用者暴露了太多 API,這無疑加劇了使用者的心智負擔,可謂之「不友好」。另外,其官方文檔也有點稍顯雜亂,讓初學者抓不住輕重。chrome

SQLAlchemy 使用最多的地方,大概就是與 Flask 的結合了,即 Flask-SQLAlchemy。這就是 SQLAlchemy 的 Wrapper,固然若是咱們沒有使用 Flask,那麼就須要本身封裝一層 Wrapper 了,或者使用別人已經弄好的 Wrapper。bash

至於爲何,如上文所述,SQLAlchemy給使用暴露的API太多,讓人感到無所適從(不過若是使用得熟練了,他仍是很順手的)。session

Model 之上再封裝一層 Model Manager

定義完 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

包裝一個 OrmUtils

增刪該查是每個 Model 都會具備的操做,若是每一個 Manager 中都寫一大堆重複的create_xxx, get_xxx,那很明顯咱們是在Repeat Yourselfspa

首先咱們會想到使用繼承來解決,定義一個 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)
複製代碼

使用一款 migration 工具

我是一個 Django 黨,我對 Django 印象最深入的就是它的 ORM 了,功能完善並且十分強大。可是對 SQLAlchemy 來講,如前文所述,它只不過是一款 Library,天然沒有 Migration 工具。

可是其做者本身也寫了對應的 migration 庫,沒有和 SQLAlchemy 整合到一塊兒(你們能夠Google下)。總的來講,還湊合,可堪一用(天然不能和Django的migration比)。

附錄

相關文章
相關標籤/搜索