Python,数据科学中最受欢迎的编程语言,总是与MongoDB完美搭配,用于构建强大的应用程序。Django,最流行的Python网络框架,是构建使用MongoDB的安全且易于维护的应用程序的理想工具。
使用MongoDB与Django的优点是:
MongoDB与Django满足上述标准并提供更多功能。这就是本教程将学习的内容。
MongoDB是一种灵活的、无模式的、JSON风格的、基于文档的数据库。以下是SQL和MongoDB在药店数据库中插入药品的对比示例。
SQL | MongoDB |
请注意,我们在创建集合的同时插入了一个记录。在MongoDB中,如果集合不存在,则会动态创建。
在SQL中,如果我们忘记提供medicine_id
,由于它是主键(不可为空),记录将失败。而在MongoDB中,默认的主键字段是_id
,我们可以不提供medicine_id
就插入记录。
使用MongoDB的其他好处包括高可用性、索引和非依赖复杂连接。Atlas提供安全性、可扩展性、零停机补丁和升级。Atlas非常适合存储大量结构化和非结构化数据。
如果您将处理大数据,您将需要使用基于云的服务。这正是MongoDB Atlas支持无限集群的能力可以帮助的地方。您可以使用Atlas轻松部署、运行和扩展MongoDB。 了解更多关于MongoDB Atlas的信息。
有三种方法可以将Django连接到MongoDB
连接Django MongoDB的哪种方法更好?让我们在接下来的章节中探讨这个问题。
为了使集成工作,您应该有一个Django和MongoDB设置。如果您在机器上安装了Python,您可以使用pip安装Django。如果您希望在一个特定环境中安装Django而不是整个系统,您可以创建一个虚拟环境。使用pip/pip3取决于您的Python版本
安装
Windows
pip install virtualenvwrapper-win
Mac OS / Linux
pip install virtualenvwrapper
创建
Windows
mkvirtualenv MyProjectEnvt
Mac OS / Linux
virtualenv MyProjectEnvt
激活
Mac OS / Linux
source MyProjectEnvt/bin/activate
Windows
workon MyProjectEnvt
要取消激活虚拟环境,只需键入命令deactivate
。
现在使用pip install Django
安装Django。
要启动一个Django项目,转到您想要开始项目的文件夹,并使用以下命令
django-admin startproject <project_name>.
例如,
C:\Users\myuser\project_files>django-admin startproject MyFirstDjangoProj
C:\Users\myuser\project_files>cd MyFirstDjangoProj
要创建一个应用程序,请使用以下命令
python manage.py startapp myfirstapp
如果您使用的是 Python 版本 >= 3.0,请在命令中将 python 替换为 python3。
在应用程序中,我们可以拥有许多模型,这些模型将映射到 MongoDB 中的集合和文档。
一旦开始项目,所有文件都将可用在项目文件夹中。使用 python manage.py runserver
命令启动服务器。
您的 Django 设置现在已完成。
如果您还没有设置 MongoDB,请使用 MongoDB Atlas 来充分利用云托管。Atlas 与所有主要云服务提供商无缝协作。
PyMongo 非常高效,可以将 JSON 数据写入 MongoDB,并允许在 Python 代码本身中使用 MongoDB 查询。我们可以使用 PyMongo 以字典语法检索数据。
使用 pip/pip3 命令轻松安装 PyMongo
pip install pymongo[snappy,gssapi,srv,tls]
如果您正在使用虚拟环境(您正在使用!),您必须在 ..\venv\Lib\site-packages 文件夹中安装 pymongo。
此外,使用以下命令安装 dnspython 以使用 mongodb+srv:// URI
pip install dnspython
使用 PyMongo,我们可以通过指定连接实例的正确数据库名称来并发运行多个数据库。
让我们创建一个样本 pymongo 会话。有两种方法可以实现这一点
我们可以在 utils 文件中创建一个客户端,该客户端可用于任何想要与 MongoDB 交互的视图。在项目文件夹中(与 manage.py 相同的位置)创建一个 utils.py 文件,并实例化客户端
from pymongo import MongoClient
def get_db_handle(db_name, host, port, username, password):
client = MongoClient(host=host,
port=int(port),
username=username,
password=password
)
db_handle = client['db_name']
return db_handle, client
此方法可以用于 ./myfirstapp/view.py。
获取连接的另一种方法是使用连接字符串
from pymongo import MongoClient
client = MongoClient('connection_string')
db = client['db_name']
其中
connection_string = mongodb+srv://<username>:<password>@<atlas cluster>
/<myFirstDatabase>?retryWrites=true&w=majority
例如,
makemyrx_db = client['sample_medicines']
#collection object
medicines_collection = makemyrx_db['medicinedetails']
您可能已经在其他代码示例或教程中看到过 Connection 类的使用。Connection 已被弃用,因此不要使用它。
如果您在默认端口和主机上,只需调用 MongoClient()。要连接到 localhost,我们可以显式指定主机和端口,如下所示
MongoClient(‘localhost’, 27017)
或者
使用 URL 格式 MongoClient(‘mongodb://127.0.0.1: 27017/’)
由于我们已经在这里创建了客户端,因此需要在 settings.py 文件中注释掉 DATABASES 部分。使用三引号进行相同的注释。
MongoEngine 是 PyMongo 之上的一个 ORM 层。因此,您仍然需要在您的系统上安装 PyMongo (>=3.4) 以使用 MongoEngine。
使用 MongoEngine 连接 Django 和 MongoDB 可以让您使用 ListField 和 DictField 等字段来处理大量非结构化 JSON 数据。
首先,使用以下命令安装 MongoEngine
pip install mongoengine
如前所述,在使用 PyMongo 时,我们必须在 settings.py 中注释掉 DATABASES 部分。然后,为了使用 MongoEngine,添加以下内容
import mongoengine
mongoengine.connect(db=db_name, host=hostname, username=username, password=pwd)
在 MongoEngine 中,我们必须在 Django 应用程序的 models.py 文件中定义一个模式。MongoDB 是无模式的。模式仅在应用级别强制执行,使未来的更改快速且简单。
MongoEngine 与 Django 的默认 ORM 类似,但在 model.py 中有以下变化
Django 的 ORM | MongoEngine |
from django.db import models | from mongoengine import Document, fields 或 from mongoengine import * |
Model | Document |
models.CharField | fields.StringField() |
区别在于,当我们使用 MongoEngine 时,我们使用 models,它们被替换为 documents 和 fields。
有许多其他工具被编写来与PyMongo一起使用。
Djongo在PyMongo之上进行了改进,因为开发人员无需编写冗长的查询。它将Python对象映射到MongoDB文档,即对象文档映射(ODM)。Djongo确保只有干净的数据进入数据库。通过使用Djongo执行完整性检查、应用验证等,无需修改现有的Django ORM。
安装Djongo
pip install djongo
现在,进入您的项目文件夹(例如,MyFirstDjangoProj),并打开settings.py文件。您可以使用Textpad、Python IDE或任何编辑器进行编辑。搜索DATABASES,并将设置更改为指向MongoDB。ENGINE将是djongo,而数据库名称(NAME)将是您的MongoDB数据库名称。
DATABASES = {
'default': {
'ENGINE': 'djongo',
'NAME': 'db-name',
}
}
如果您的数据库不在localhost上或受到保护,您还应填写客户端信息,如HOST、USERNAME、PASSWORD等。
DATABASES = {
'default': {
'ENGINE': 'djongo',
'NAME': 'your-db-name',
'ENFORCE_SCHEMA': False,
'CLIENT': {
'host': 'mongodb+srv://<username>:<password>@<atlas cluster>/<myFirstDatabase>?retryWrites=true&w=majority'
}
}
}
请确保在settings.py的INSTALLED_APPS设置中添加了app-name
INSTALLED_APPS = [
'myfirstapp',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
现在我们有了Django项目(和应用程序),您可以使用以下命令在MongoDB中创建集合
python manage.py makemigrations <app-name>
python manage.py migrate
集合(应用程序中的Django模型——注意我们是在谈论应用程序而不是项目)将被创建。您可以通过打开Django Admin来检查相同的内容。
您可以使用Admin GUI或手动向集合中插入数据。
要使用管理控制台,请打开您的浏览器并转到http://127.0.0.1:8000/admin(或localhost)。您应该创建一个超级用户以进入管理控制台。如果您在您的应用程序中没有任何模型,请遵循Django教程,了解如何创建和注册模型。
如果您想让Djongo无迁移,请在数据库配置中将ENFORCE_SCHEMA: False
设置为False。使用此设置,集合会即时创建,而Djongo不会将SQL语句转换为MongoDB命令。
(您可以随时一起编写代码或从本GitHub存储库中下载完整代码。)
在本快速教程中,我们将演示如何使用PyMongo进行简单的CRUD操作。为此,让我们创建一个PyMongo会话
import pymongo
#connect_string = 'mongodb+srv://<username>:<password>@<atlas cluster>/<myFirstDatabase>?retryWrites=true&w=majority'
from django.conf import settings
my_client = pymongo.MongoClient(connect_string)
# First define the database name
dbname = my_client['sample_medicines']
# Now get/create collection name (remember that you will see the database in your mongodb cluster only after you create a collection
collection_name = dbname["medicinedetails"]
#let's create two documents
medicine_1 = {
"medicine_id": "RR000123456",
"common_name" : "Paracetamol",
"scientific_name" : "",
"available" : "Y",
"category": "fever"
}
medicine_2 = {
"medicine_id": "RR000342522",
"common_name" : "Metformin",
"scientific_name" : "",
"available" : "Y",
"category" : "type 2 diabetes"
}
# Insert the documents
collection_name.insert_many([medicine_1,medicine_2])
# Check the count
count = collection_name.count()
print(count)
# Read the documents
med_details = collection_name.find({})
# Print on the terminal
for r in med_details:
print(r["common_name"])
# Update one document
update_data = collection_name.update_one({'medicine_id':'RR000123456'}, {'$set':{'common_name':'Paracetamol 500'}})
# Delete one document
delete_data = collection_name.delete_one({'medicine_id':'RR000123456'})
接下来,您可以连接到您的MongoDB Atlas集群并验证相同的内容。单击集合,您可以在左侧看到新创建的数据库和集合:
在右侧,您将看到一条记录(因为我们已删除一条):
现在我们知道了连接Django和MongoDB的不同方式,我们必须为我们的项目选择正确的方法。这些方法都有其自身的优缺点。
例如,如果您是从零开始,MongoEngine是一个不错的选择,因为它可以轻松处理大量非结构化数据。如果您在应用程序中需要编写大量复杂查询,则应选择PyMongo。
如果您有一个需要从其他数据库迁移到MongoDB的Django项目,Djongo更合适,因为这将需要最少的代码更改。
是的,有三种方法可以使用MongoDB与Django一起使用。
Django 是一个非常流行的 Python 网络应用框架。MongoDB 提供了一种高度可扩展、灵活的方式来存储和检索大量非结构化数据。结合 Django 和 MongoDB 可以获得两者的优点以及高性能的应用程序。
连接 Django 和 MongoDB 有三种方式。它们是 PyMongo、MongoEngine 和 Djongo。
PyMongo 是连接 Django 和 MongoDB 的官方支持方式。使用 MongoEngine 为 Django 模型对象中的 Python 列表和字典对象提供额外的支持。如果你的项目使用关系型数据库,并且想要迁移到非关系型数据库,如 MongoDB,那么 Djongo 是一个不错的选择,它可以转换 SQL 查询字符串为 MongoDB 查询文档。
Django 是一个 Python 的网络框架,最出名的是其在数据科学领域的应用。虽然关系型数据库由于其使用而非常流行。但由于可扩展性、可用性和灵活性,开发者开始转向 NoSQL 数据库。MongoDB 是最受欢迎的 NoSQL 数据库之一,它以集合和文档的形式存储非结构化数据,便于检索。MongoDB 还提供了 图表,你可以通过它执行简单的聚合操作和查看有助于数据分析的可视化。