簡介
MongoDB 是一個文件型資料庫,是 NoSQL (not only SQL) 的一種,具有靈活、易擴充套件等諸多優點,受到許多開發者的青睞。MongoEngine 是一個用來操作 MongoDB 的 ORM 框架,如果你不知道什麼是 ORM,可以參考 Flask-SQLAlchemy 一節。在 Flask 中,我們可以直接使用 MongoEngine,也可使用 Flask-MongoEngine ,它使得在 Flask 中使用 MongoEngine 變得更加簡單。
安裝
使用 pip 安裝,如下:
1 |
$ pip install flask-mongoengine |
使用
在使用之前,請確保 mongo 服務已經開啟。
配置
我們需要配置 MongoDB 的相關引數,以便我們能訪問資料庫。
1 2 3 4 5 6 7 8 9 10 |
# -*- 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) |
上面的程式碼中,我們在 app.config
的 MONGODB_SETTINGS
字典中配置了資料庫、主機和埠。如果資料庫需要身份驗證,那我們需要在該字典中新增 username
和 password
引數,比如:
1 2 3 4 5 |
app.config['MONGODB_SETTINGS'] = { 'db': 'test', 'username':'admin', 'password':'12345' } |
另外,上面的配置也可以改成下面的方式:
1 2 3 4 5 |
p.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' |
如果我們想在應用初始化前配置資料庫,比如使用工廠方法,可以類似這樣做:
1 2 3 4 5 6 7 |
from flask import Flask from flask_mongoengine import MongoEngine db = MongoEngine() ... app = Flask(__name__) app.config.from_pyfile('config.json') db.init_app(app) |
定義資料模型
接下來,我們需要定義資料模型。這裡,我們以一個 Todo
資料庫為例,資料模型定義如下:
1 2 3 4 5 6 7 8 9 10 |
from datetime import datetime class 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) |
在上面的程式碼中,我們定義了一個 Todo
類,meta
字典設定了 collection
,ordering
和 strict
,其中 ordering
的值可以指定你的 QuerySet 的預設順序,strict
的值指定是否使用嚴格模式,預設值是 True
,也就是使用嚴格模式,這就意味著如果資料庫的記錄如果存在某些欄位沒有在我們的資料模型中宣告,那程式在執行時會產生一個 FieldDoesNotExist
的錯誤。因此,我們的資料模型定義最好跟記錄中的欄位保持一致。
查詢資料
- 查詢所有資料使用
all()
方法
1todos = Todo.objects().all() - 查詢滿足某些條件的資料
12task = 'cooking'todo = Todo.objects(task=task).first()
其中,first()
方法會取出滿足條件的第 1 條記錄。
新增資料
- 新增資料使用
save()
方法
12todo1 = Todo(task='task 1', is_completed=False)todo1.save()
資料排序
- 排序使用
order_by()
方法
1todos = Todo.objects().order_by('create_at')
更新資料
- 更新資料需要先查詢資料,然後再更新
12345task = 'task 1'todo = Todo.objects(task=task).first() # 先查詢if not todo:return "the task doesn't exist!"todo.update(is_completed=True) # 再更新
刪除資料
- 刪除資料使用
delete()
方法:先查詢,再刪除
12345task = 'task 6'todo = Todo.objects(task=task).first() # 先查詢if not todo:return "the task doesn't exist!"todo.delete() # 再刪除
分頁
- 分頁可結合使用
skip()
和limit()
方法
123456789skip_nums = 1limit = 3todos = Todo.objects().order_by('-create_at').skip(skip_nums).limit(limit)
- 使用
paginate()
方法
12def view_todos(page=1):todos = Todo.objects.paginate(page=page, per_page=10)
本文完整的程式碼在這裡。