文章目录

  • 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

何时使用池化客户端:

  1. 进行大部分常规的数据库操作,如增删改查、简单聚合等。这可以充分利用连接池的优势。
  2. 当需要高性能且并发度较高的场景。连接池可以大大减少创建新连接的开销。
  3. 当需要管理和控制数据库连接,避免大量连接消耗系统资源时。

使用连接池连接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的连接池并封装一个单例模式是很好的实践:

  1. 重用数据库连接,提高性能和效率。使用连接池可以重用连接,减少重复创建和关闭连接的开销。
  2. 协调资源,避免过多连接。通过设置最大连接数,可以控制连接数量,避免因连接过多导致的资源问题。

使用Django信号关闭连接池
在Django应用退出时,可以使用信号来关闭数据库连接池,释放资源