一個好用的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...