Flask 插件系列 - Flask-MongoEngine
簡介
MongoDB 是一個文檔型數據庫,是 NoSQL (not only SQL) 的一種,具有靈活、易擴展等諸多優點,受到許多開發者的青睞。 MongoEngine 是一個用來操作 MongoDB 的 ORM 框架,如果你不知道什么是 ORM,可以參考 Flask-SQLAlchemy 一節。在 Flask 中,我們可以直接使用 MongoEngine,也可使用 Flask-MongoEngine ,它使得在 Flask 中使用 MongoEngine 變得更加簡單。
安裝
使用 pip 安裝,如下:
$ pip install flask-mongoengine
使用
在使用之前,請確保 mongo 服務已經開啟。
配置
我們需要配置 MongoDB 的相關參數,以便我們能訪問數據庫。
-- coding: utf-8 --
from flask import Flask from flask_mongoengine import MongoEngine
app = Flask(name) app.config['MONGODB_SETTINGS'] = { 'db': 'test', 'host': '127.0.0.1', 'port': 27017 }
db = MongoEngine(app)</pre>
上面的代碼中,我們在 app.config 的 MONGODB_SETTINGS 字典中配置了數據庫、主機和端口。如果數據庫需要身份驗證,那我們需要在該字典中添加 username 和 password 參數,比如:
app.config['MONGODB_SETTINGS'] = { 'db': 'test', 'username':'admin', 'password':'12345' }另外,上面的配置也可以改成下面的方式:
app.config['MONGODB_DB'] = 'test' app.config['MONGODB_HOST'] = '127.0.0.1' app.config['MONGODB_PORT'] = 27017 app.config['MONGODB_USERNAME'] = 'admin' app.config['MONGODB_PASSWORD'] = '12345'如果我們想在應用初始化前配置數據庫,比如使用工廠方法,可以類似這樣做:
from flask import Flask from flask_mongoengine import MongoEngine db = MongoEngine()...
app = Flask(name) app.config.from_pyfile('config.json') db.init_app(app)</pre>
定義數據模型
接下來,我們需要定義數據模型。這里,我們以一個 Todo 數據庫為例,數據模型定義如下:
from datetime import datetimeclass Todo(db.Document): meta = { 'collection': 'todo', 'ordering': ['-create_at'], 'strict': False, }
task = db.StringField() create_at = db.DateTimeField(default=datetime.now) is_completed = db.BooleanField(default=False)</pre>在上面的代碼中,我們定義了一個 Todo 類, meta 字典設置了 collection , ordering 和 strict ,其中 ordering 的值可以指定你的 QuerySet 的默認順序, strict 的值指定是否使用嚴格模式,默認值是 True ,也就是使用嚴格模式,這就意味著如果數據庫的記錄如果存在某些字段沒有在我們的數據模型中聲明,那程序在運行時會產生一個 FieldDoesNotExist 的錯誤。因此,我們的數據模型定義最好跟記錄中的字段保持一致。
查詢數據
-
查詢所有數據使用 all() 方法
todos = Todo.objects().all()
-
查詢滿足某些條件的數據
task = 'cooking' todo = Todo.objects(task=task).first()
其中, first() 方法會取出滿足條件的第 1 條記錄。
添加數據
-
添加數據使用 save() 方法
todo1 = Todo(task='task 1', is_completed=False) todo1.save()
數據排序
-
排序使用 order_by() 方法
todos = Todo.objects().order_by('create_at')
更新數據
-
更新數據需要先查找數據,然后再更新
task = 'task 1'
todo = Todo.objects(task=task).first() # 先查找
if not todo:
return "the task doesn't exist!"
todo.update(is_completed=True) # 再更新
刪除數據
-
刪除數據使用 delete() 方法:先查找,再刪除
task = 'task 6'
todo = Todo.objects(task=task).first() # 先查找
if not todo:
return "the task doesn't exist!"
todo.delete() # 再刪除
分頁
-
分頁可結合使用 skip() 和 limit() 方法
skip_nums = 1
limit = 3
todos = Todo.objects().order_by(
'-create_at'
).skip(
skip_nums
).limit(
limit
)
-
使用 paginate() 方法
def view_todos(page=1):
todos = Todo.objects.paginate(page=page, per_page=10)
來自:https://segmentfault.com/a/1190000007413570