SQLAlchemy 最佳實踐

2021-09-11 13:03:51 字數 1968 閱讀 7449

按照我對 sqlalchemy 的理解,其實它的定位大概類似於:

一款比較偏底層 orm lib

提供了一些基礎了 orm 功能,包括 sqlalchemy core 和 sqlalchemy orm

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

至於為什麼,如上文所述,sqlalchemy給使用暴露的api太多,讓人感到無所適從(不過如果使用得熟練了,他還是很順手的)。

定義完 model 之後,馬上我們就到了業務邏輯這個層次了。

沒有會把乙個 model 匯入到 controller 層使用,封裝乙個 manager 層是必須的( 如果必要,視業務邏輯複雜性,還可引入更多的層次)。

比如(以 flask 為例)

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。

增刪該查是每乙個 model 都會具有的操作,如果每個 manager 中都寫一大堆重複的create_***, get_***,那很明顯我們是在repeat yourself

首先我們會想到使用繼承來解決,定義乙個 basemanager 基類,然後大家都繼承它,整個過程都很符合繼承的思維直覺。不過我比較偏好寫各種 utils 來解決,把通用的不變的邏輯放到 utils 中,然後各個 manager 將操作**到 utils 中。

比如:

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比)。

最佳實踐 Flutter 最佳實踐

最佳實踐是乙個領域可以接受的專業標準,對於任何程式語言來說,提高 質量 可讀性 可維護性和健壯性都非常重要。讓我們探索一些設計和開發flutter應用程式的最佳實踐。class enum typedef和extension應採用駝峰命名uppercamelcase規則。class mainscree...

JUnit最佳實踐

junit最佳實踐 cherami 轉貼 參與分 20053,專家分 4960 發表 2003 9 16 下午7 57 版本 1.0 閱讀 3899次 martin fowler說過 當你試圖列印輸出一些資訊或除錯乙個表示式時,寫一些測試 來替代那些傳統的方法。一開始,你會發現你總是要建立一些新的f...

SVN最佳實踐

楊爭 subversion是新一代的版本控制工具,由於其優於cvs的一些特點,得到了越來越多人的關注和使用,本人根據自己使用svn的經驗,寫了這篇文章,希望對大家有所幫助,其中有些實踐並不是僅僅適用於svn,對其他版本控制工具也是適用的。1 養成良好的記錄日誌的習慣.svn ci提交,最好在日誌中記...