• Python3操作MongoDB数据库


    Python3操作MongoDB数据库


    在这里插入图片描述


    0. 写在前面

    • Linux:Ubuntu Kylin 16.04
    • MongoDB:MongoDB3.2.7
    • Python:Anaconda With Python3.7

    1. 安装开源驱动库pymongo

    pymongo驱动程序可以直接连接MongoDB数据库

    zhangsan@node01:~$ conda create -n py39 python = 3.9
    zhangsan@node01:~$ conda activate py39
    (py39) zhangsan@node01:~$ python3 -m pip install pymongo
    Collecting pymongo
      Downloading pymongo-4.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (479 kB)
         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 479.2/479.2 kB 37.7 kB/s eta 0:00:00
    Installing collected packages: pymongo
    Successfully installed pymongo-4.2.0
    
    (py39) zhangsan@node01:~$ vim pyinsert.py
    
    from pymongo import MongoClient
    from random import randint
    import datetime
    client = MongoClient('localhost',27017)
    db = client.taobao
    order = db.order_info
    status = ['A','B','C']
    cust_id = ['A123','B123','C123']
    price = [500,200,250,300]
    sku = ['mmm','nnn']
    for i in range(1,100):
        items = []
        item_count =randint(2,6)
        for n in range(item_count):
            items.append({"sku":sku[randint(0,1)],"qty":randint(1,10),"price":randint(0,5)})
            new = { "status":status[randint(0,2)], "cust_id":cust_id[randint(0,2)], "price":price[randint(0,3)], "ord_date":datetime.datetime.utcnow(), "items":items }
            print(new)
            order.insert_one(new)
    print(order.estimated_document_count())
    
    • 启动MongoDB
    (py39) zhangsan@node01:/usr/local/mongodb-3.2.7$ mongod --config /mongodb/single/mongod.conf
    about to fork child process, waiting until server is ready for connections.
    forked process: 3493
    child process started successfully, parent exiting
    
    • 查看服务
    (py39) zhangsan@node01:/usr/local/mongodb-3.2.7$ ps -ef | grep mongo
    zhangsan       3493     1  3 00:56 ?        00:00:01 mongod --config /mongodb/single/mongod.conf
    zhangsan       3511  3214  0 00:57 pts/0    00:00:00 grep --color=auto mongo
    
    • 执行py程序
    (py39) zhangsan@node01:~$ python3 pyinsert.py
    pymongo.errors.ConfigurationError: Server at localhost:27017 reports wire version 4, but this version of PyMongo requires at least 6 (MongoDB 3.6).
    
    

    很明显,此处需要降低驱动pymongo的版本

    • 卸载pymongo
    (py39) zhangsan@node01:~$ pip uninstall -y pymongo
    Found existing installation: pymongo 4.2.0
    Uninstalling pymongo-4.2.0:
      Successfully uninstalled pymongo-4.2.0
    (py39) zhangsan@node01:~$ pip3 list
    Package      Version
    ------------ ------------
    certifi      2022.6.15
    pip          22.1.2
    setuptools   63.4.1
    
    • 安装pymongo3.6版本
    (py39) zhangsan@node01:~$ pip3 install pymongo==3.6
    Collecting pymongo==3.6
      Downloading pymongo-3.6.0.tar.gz (583 kB)
         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 583.3/583.3 kB 52.1 kB/s eta 0:00:00
      Preparing metadata (setup.py) ... done
    Building wheels for collected packages: pymongo
      Building wheel for pymongo (setup.py) ... done
      Created wheel for pymongo: filename=pymongo-3.6.0-cp39-cp39-linux_x86_64.whl size=272327 sha256=72a9dacdef7afa26cb169debe429964d1b5ab119ee39e7ec4c3eb5c59c5433c0
      Stored in directory: /home/zhangsan/.cache/pip/wheels/6c/97/2e/74c0fd06fe0df24ded743a8af0707d1b5d618a0e8d321ba85c
    Successfully built pymongo
    Installing collected packages: pymongo
    Successfully installed pymongo-3.6.0
    (py39) zhangsan@node01:~$ pip3 list | grep pymongo
    pymongo      3.6.0
    
    • 继续报错:AttributeError: module 'platform' has no attribute 'linux_distribution'
    (py39) zhangsan@node01:~$ python3 pyinsert.py 
    Traceback (most recent call last):
      File "/home/zhangsan/pyinsert.py", line 1, in 
        from pymongo import MongoClient 
      File "/usr/local/anaconda/envs/py39/lib/python3.9/site-packages/pymongo/__init__.py", line 87, in 
        from pymongo.mongo_client import MongoClient
      File "/usr/local/anaconda/envs/py39/lib/python3.9/site-packages/pymongo/mongo_client.py", line 52, in 
        from pymongo.client_options import ClientOptions
      File "/usr/local/anaconda/envs/py39/lib/python3.9/site-packages/pymongo/client_options.py", line 23, in 
        from pymongo.pool import PoolOptions
      File "/usr/local/anaconda/envs/py39/lib/python3.9/site-packages/pymongo/pool.py", line 124, in 
        platform.linux_distribution() if part])),
    AttributeError: module 'platform' has no attribute 'linux_distribution'
    

    关于这个error,其实是Python自身的原因

    Python从3.8版本开始,已经从平台模块中删除了“linux_distribution()”函数

    前文使用的是Python3.9,解决这个问题有两种方法:

    • 修改Python3.9源码
    • 降低Python版本到3.7
    • 新建一个Python3.7虚拟环境
    zhangsan@node01:~$ conda create -n pymongo python = 3.7
    zhangsan@node01:~$ conda activate pymongo
    (pymongo) zhangsan@node01:~$ python3 -m pip install pymongo=3.6
    Collecting pymongo
      Downloading pymongo-3.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (479 kB)
         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 479.2/479.2 kB 37.7 kB/s eta 0:00:00
    Installing collected packages: pymongo
    Successfully installed pymongo-3.6.0
    
    • 再次执行py程序,运行成功
    (pymongo) zhangsan@node01:~$ python3 pyinsert.py
    

    上述代码中使用了estimated_document_count()函数,该函数是MongoDB4.0.3的新功能,此处会出现错误,改为count()函数即可

    2. 参考

    https://stackoverflow.com/questions/63636697/error-module-platform-has-no-attribute-linux-distribution
    
  • 相关阅读:
    ImportError: Unknown magic number 3495 in test.pyc
    Django练习
    云原生中间件RocketMQ(二)源码包结构和集群架构模型
    AWS Academy LMS 考勤 - 教师
    【数据科学】Bokeh[使用Bokeh绘图、数据、绘图、渲染器与自定义可视化、输出与导出、显示或保存图形]
    ElasticSearch7.3学习(二十二)----Text字段排序、Scroll分批查询场景解析
    CTF网络安全题目个人导航【持续更新】
    Qt 自定义提示框 类似QMessageBox
    K8S 部署和访问 Kubernetes 仪表板(Dashboard)
    生存分析原理简明教程 单因素生存分析 Kaplan-Meier、LogRank 只能针对单一的变量进行 多因素cox回归分析
  • 原文地址:https://blog.csdn.net/m0_52735414/article/details/127091483