MongoEngineを使用したMongoDB
MongoDBのようなドキュメントデータベースを使用することは、リレーショナルSQLデータベースの一般的な代替手段です。 このパターンは、ドキュメントマッパーライブラリである MongoEngine を使用してMongoDBと統合する方法を示しています。
実行中のMongoDBサーバーと Flask-MongoEngine が必要です。
pip install flask-mongoengine
設定
基本的なセットアップは、app.config
でMONGODB_SETTINGS
を定義し、MongoEngine
インスタンスを作成することで実行できます。
from flask import Flask
from flask_mongoengine import MongoEngine
app = Flask(__name__)
app.config['MONGODB_SETTINGS'] = {
"db": "myapp",
}
db = MongoEngine(app)
マッピングドキュメント
Mongoドキュメントを表すモデルを宣言するには、Document
から継承するクラスを作成し、各フィールドを宣言します。
import mongoengine as me
class Movie(me.Document):
title = me.StringField(required=True)
year = me.IntField()
rated = me.StringField()
director = me.StringField()
actors = me.ListField()
ドキュメントにネストされたフィールドがある場合は、EmbeddedDocument
を使用して埋め込みドキュメントのフィールドを定義し、EmbeddedDocumentField
を使用して親ドキュメントで宣言します。
class Imdb(me.EmbeddedDocument):
imdb_id = me.StringField()
rating = me.DecimalField()
votes = me.IntField()
class Movie(me.Document):
...
imdb = me.EmbeddedDocumentField(Imdb)
データの作成
フィールドのキーワード引数を使用してドキュメントクラスをインスタンス化します。 インスタンス化後にフィールド属性に値を割り当てることもできます。 次に、doc.save()
を呼び出します。
bttf = Movie(title="Back To The Future", year=1985)
bttf.actors = [
"Michael J. Fox",
"Christopher Lloyd"
]
bttf.imdb = Imdb(imdb_id="tt0088763", rating=8.5)
bttf.save()
クエリ
クラスobjects
属性を使用してクエリを実行します。 キーワード引数は、フィールドで等しい値を探します。
bttf = Movies.objects(title="Back To The Future").get_or_404()
クエリ演算子は、二重アンダースコアを使用してフィールド名と連結することで使用できます。 objects
、およびそれを呼び出すことによって返されるクエリは反復可能です。
some_theron_movie = Movie.objects(actors__in=["Charlize Theron"]).first()
for recents in Movie.objects(year__gte=2017):
print(recents.title)