文章目录
- python库-pymongo库 | Python操作Mongodb数据库
- 1. pymongo包
- 2. 安装pymongo包
- 3. 官方示例
- 使用连接池连接MongoDB
- pymongo版本不同,其API也会有差异
- 4. Django项目连接MongoDB方式选型
- 1.PyMongo
- 2. Djongo
- 3. MongoEngine
- 5. 哪种方法连接到 Django MongoDB 更好呢?
- 6. pymongo 连接池 以及封装一个单例实战
python库-pymongo库 | Python操作Mongodb数据库
1. pymongo包
github:https://github.com/mongodb/mongo-python-driver
PyMongo用于与Python与MongoDB数据库进行交互的工具。bson包是Python的BSON格式 的实现。Pymongo包是MongoDB的本地Python驱动程序。gridfs包是gridfs 的pymongo实现。
Pymongo支持MongoDB 3.6、4.0、4.2、4.4、5.0和6.0。
总结:PyMongo 是 MongoDB 与 Django 交互的标准驱动程序。这是在 Python 中使用 MongoDB 的官方和首选方式。
2. 安装pymongo包
进入到virtualenv环境下,
执行命令
python -m pip install pymongo
3. 官方示例
官方示例:https://github.com/mongodb/mongo-python-driver
import pymongo
client = pymongo.MongoClient(“localhost”, 27017)
db = client.test
db.name
‘test’
db.my_collection
Collection(Database(MongoClient(‘localhost’, 27017), ‘test’), ‘my_collection’)
db.my_collection.insert_one({“x”: 10}).inserted_id
ObjectId(‘4aba15ebe23f6b53b0000000’)
db.my_collection.insert_one({“x”: 8}).inserted_id
ObjectId(‘4aba160ee23f6b543e000000’)
db.my_collection.insert_one({“x”: 11}).inserted_id
ObjectId(‘4aba160ee23f6b543e000002’)
db.my_collection.find_one()
{‘x’: 10, ‘_id’: ObjectId(‘4aba15ebe23f6b53b0000000’)}
for item in db.my_collection.find():
… print(item[“x”])
…
10
8
11
db.my_collection.create_index(“x”)
‘x_1’
for item in db.my_collection.find().sort(“x”, pymongo.ASCENDING):
… print(item[“x”])
…
8
10
11
[item[“x”] for item in db.my_collection.find().limit(2).skip(1)]
[8, 11]
使用连接池连接MongoDB
何时使用池化客户端:
- 进行大部分常规的数据库操作,如增删改查、简单聚合等。这可以充分利用连接池的优势。
- 当需要高性能且并发度较高的场景。连接池可以大大减少创建新连接的开销。
- 当需要管理和控制数据库连接,避免大量连接消耗系统资源时。
使用连接池连接MongoDB的好处:
- 降低连接开销,提高性能和效率。
- 管理和控制连接数量,避免系统资源消耗过高。
- 简化连接管理,通过简单的获取连接操作就可以进行数据库访问。
- 方便对连接进行统一的设置和维护,如超时时间、重试次数等。
from pymongo import MongoClient
from concurrent.futures import ThreadPoolExecutor
import socket
import time
import os
MONGO_HOST = os.environ.get('MONGO_HOST')
MONGO_PORT = os.environ.get('MONGO_PORT')
MONGO_USER = os.environ.get('MONGO_USER')
MONGO_PASSWORD = os.environ.get('MONGO_PASSWORD')
class MongoDB:
def __init__(self):
self.mongo_url = f'mongodb://{MONGO_USER}:{MONGO_PASSWORD}@{MONGO_HOST}:{MONGO_PORT}'
self.pool = ThreadPoolExecutor(max_workers=10)
self.client = MongoClient(self.mongo_url,connectTimeoutMS=5000)
def get_client(self):
return self.pool.submit(MongoClient, self.mongo_url,
connectTimeoutMS=5000)
def get_database(self, name):
client = self.get_client()
db = client[name]
return db
def insert_one(self, db_name, collection_name, doc):
try:
db = self.get_database(db_name)
collection = db[collection_name]
collection.insert_one(doc)
except Exception as e:
logger.error(f'Failed to insert document into {db_name}.{collection_name}: {e}')
def close(self):
self.client.close()
self.pool.shutdown()
pymongo版本不同,其API也会有差异
例如,在pymongo 2.x版本中,Database对象的集合列出方法是collection_names(),而在3.x中改为了list_collection_names()。
我在 pymongo-4.3.3 版本发现,没有了 collection_names()方法,而是list_collection_names()!
4. Django项目连接MongoDB方式选型
有三种方法连接Django到MongoDB数据库
1.PyMongo
PyMongo 是 MongoDB 与 Django 交互的标准驱动程序。这是在 Python 中使用 MongoDB 的官方和首选方式。 PyMongo 提供了执行所有数据库操作的功能,例如搜索、删除、更新和插入。由于 PyMongo 可与 PyPI 一起使用,您可以使用 pip 命令快速安装它。
2. Djongo
在Django的官方文档中,没有介绍mongodb数据库的任何使用方法,mongodb也不是django官方推荐使用的数据库。以下是django官方列出的内建数据库。官方地址:https://docs.djangoproject.com/en/4.1/ref/settings/ 查看 DATABASES¶
连接到其他数据库后端时,例如MariadB,MySQL,Oracle或PostgreSQL,将需要其他连接参数。有关如何指定其他数据库类型,请参见下面的引擎设置
如果您正在使用 SQL 这样的关系型数据库并希望迁移到 MongoDB,那么您可以使用 Djongo。在不更改 Django ORM 的情况下,Djongo 将所有 SQL 查询转换为 MongoDB 语法查询。
Djongo 是对 PyMongo 的改进,因为开发人员无需编写冗长的查询。它将 Python 对象映射到 MongoDB 文档,即对象文档映射 (ODM)。 Djongo 确保只有干净的数据才能进入数据库。通过使用 Djongo 执行完整性检查、应用验证等,无需修改现有的 Django ORM。
安装Djongo:
pip install djongo
django配置Djongo
打开 settings.py 文件,搜索 DATABASES,并将设置更改为指向 MongoDB。 ENGINE 将是 djongo,数据库名称 (NAME) 将是您的 MongoDB 数据库名称。
DATABASES = {
'default': {
'ENGINE': 'djongo',
'NAME': 'db-name',
}
}
如果您的数据库不在本地主机上或受到保护,您还应该填写 CLIENT 信息,如 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'
}
}
}
3. MongoEngine
官网:http://mongoengine.org/
MongoEngine 使用教程(一)
参考URL:
MongoEngine是MongoDB的一个ODM(Object-Document Mapper)框架,它提供了类似Django的语法来操作MongoDB数据库。
5. 哪种方法连接到 Django MongoDB 更好呢?
如果您要在应用程序中编写大量复杂的查询,则应该使用 PyMongo。 如果您有一个 Django 项目需要从另一个数据库迁移到 MongoDB,那么 Djongo 更合适,因为这需要最少的代码更改。
6. pymongo 连接池 以及封装一个单例实战
使用PyMongo的连接池并封装一个单例模式是很好的实践:
- 重用数据库连接,提高性能和效率。使用连接池可以重用连接,减少重复创建和关闭连接的开销。
- 协调资源,避免过多连接。通过设置最大连接数,可以控制连接数量,避免因连接过多导致的资源问题。
使用Django信号关闭连接池
在Django应用退出时,可以使用信号来关闭数据库连接池,释放资源