標籤:

一個好用的ORM

先說頭圖,實在找不到了。正好周末看了《喜劇之王》。再說標題,我並沒找到一個好用的ORM,我想自己搞一個。

之前封裝過一個簡單的。大致用法是這樣的

from s_sqlachemy import DataBasennnuri = sqlite:///db.sqlitenndb = DataBase(uri)nnclass User(db.Model, db.ModelMixin):n __tablename__ = usern name = db.Column(db.String(128))n age = db.Column(db.Integer)nnnclass Post(db.Model, db.ModelMixin):n __tablename__ = postnn title = db.Column(db.String(80))n body = db.Column(db.Text)n pub_date = db.Column(db.DateTime)nn category_id = db.Column(db.Integer, db.ForeignKey(category.id))n category = db.relationship(Category,n backref=db.backref(posts, lazy=dynamic))nnnclass Category(db.Model, db.ModelMixin):n __tablename__ = categorynn name = db.Column(db.String(50))nnnnif __name__ == __main__:n db.create_all()n User.new({n name: sen,n age: 23n })n u = User.find_one({n name: sen,n })n User.update([{n id: 1,n name: ion }])n c = Category.new({n name: Pythonn })n Post.new({n title: Python,n category: cn })n p = Post.find_one({n title: Python,n })n print(p.json())n

用法和 flask-sqlachemy基本一致,只是不再依賴 flask app,加上自己寫了一套CRUD的方法,已經成為了我日常工具。可是還是存在許多問題,也是大多數ORM的問題。

大多數ORM和框架強耦合,ORM和db實例的耦合,畸形的API,像這樣:

User.select().where(User.active == True)n

這還不如直接寫SQL,來得直觀和實在。

所以我理想的ORM是避免以上問題的。

為什麼要避免以上問題,理由如下:

框架只負責請求響應,數據層面需要獨立開來,方便工具腳本的使用和換框架。

一套數據可能存在多套環境,我只需要寫一次。

畸形的API讓效率降低,且不直觀。

除此之外了,還應該有根據表結構自動生成ORM的工具。

寫出來,是為了實現這一套,以免忘記。

進階的內容是支持關係。

個人是主張寫簡單SQL來實現複雜邏輯的。

保持簡單,快速迭代。

最後,在放一張圖。

推薦閱讀:

在 PHP 領域裡,有哪些 ORM 比較好用?
為什麼很多人都喜歡 Django 的 ORM 而不是 SQLAlchemy,是因為簡單嗎?
Android 坑檔案:Ormlite OrzCache...

TAG:ORM | Python |