February 07, 2021
Python
에서 MongoDB
서버(mongoDB Atals
포함)연결 및 조작을 지원하는 모듈django ORM
을 확장하여 Python
개체를 mongoDB
문서에 매핑해주는 모듈pymongo
에 의존성을 갖는다.# settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'db_name',
'USER': 'user',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '3306',
},
'test_mongo': {
'ENGINE': 'djongo',
'NAME': 'db_name',
'CLIENT': {
'host': 'localhost',
'port': 27017,
'username': 'user',
'password': 'password',
'authSource': 'admin',
'authMechanism': 'SCRAM-SHA-1'
}
}
}
router.py
)# router.py
class Router:
def db_for_read(self, model, **hints):
if model._meta.app_label == 'app_name':
return 'app_name'
return None
def db_for_write(self, model, **hints):
if model._meta.app_label == 'app_name':
return 'app_name'
return None
def allow_relation(self, obj1, obj2, **hints):
if obj1._meta.app_label == 'app_name' or obj2._meta.app_label == 'app_name':
return True
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
if app_label == 'app_name':
return db == 'app_name'
return None
# settings.py
DATABASES_ROUTERS = ['project_name.router.Router']
# app/models.py
from djongo import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
...
django
의 models class가 아닌 djongo
의 models class를 이용하여 작성mongoDB Atlas
를 이용해야하며 비용이 발생한다. (free tier 존재)Django ORM
을 지원해주는 djongo
모듈이 있지만 온전히 지원되지 않는다.
다음은 boolean
타입의 데이터를 검색할때 djongo ORM
, mongoDB CLI
, pymongo
의 결과 비교이다.
djongo ORM
mongoDB CLI
pymongo