每日一坑(pymongo版本从3.*升到4.*)

今天在做代码优化的时候发现pymongo版本不同会出现问题,正常3.*能跑的代码,一旦使用4.2或者4.3版本(其他版本没有试,但应该也有问题)就会出现 ServerSelectionTimeoutError问题,最后到官网找到了问题所在:PyMongo 4 Migration Guide — PyMongo 4.3.0 documentation

原因总结

        在PyMongo 4.x版本中,directConnection URI选项和关键字参数的默认值从None变为了False。这一变化意味着PyMongo现在默认尝试自动发现副本集,而不再直接连接到单一的MongoDB服务器。

        因此,如果你希望与单个服务器建立直接连接,你需要明确地将directConnection设置为True,作为URI选项或关键字参数传递给MongoClient

        如果你在从PyMongo 3升级到4.x版本后遇到ServerSelectionTimeoutError错误,那么很可能是因为自动发现副本集的默认行为导致的问题。在这种情况下,你需要在创建客户端时添加directConnection=True

解决办法

就如官网所说,加上directConnection=True就可以解决问题,

首先,我们需要确保原始URI的格式是正确的,特别是要注意是否已存在其他查询参数。如果URI已经包含查询参数(如authSource=admin),我们应该使用&来连接新的参数;如果URI中还没有任何查询参数,我们应该使用?来开始参数列表。

下面是一个示例,展示了如何安全地在已存在的URI中添加directConnection=true参数:

# 假设这是您的原始MongoDB URI,它可能包含一个或多个查询参数  
mongo_uri = "mongodb://username:password@host:port/database?authSource=admin"  # 检查URI是否已经包含查询参数(即是否已经有'?')  
if '?' in mongo_uri:  # 如果已经有查询参数,使用'&'来添加新的参数  mongo_uri_with_direct_connection = f"{mongo_uri}&directConnection=true"  
else:  # 如果没有查询参数,使用'?'来开始参数列表  mongo_uri_with_direct_connection = f"{mongo_uri}?directConnection=true"  # 现在mongo_uri_with_direct_connection包含了directConnection=true参数  
print(mongo_uri_with_direct_connection)  # 使用构建好的URI创建MongoClient实例  
from pymongo import MongoClient  
client = MongoClient(mongo_uri_with_direct_connection)  # 现在你可以使用client进行数据库操作了  
db = client['your_database_name']  # 替换为你的数据库名  
collection = db['your_collection_name']  # 替换为你的集合名  
# ... 进行其他操作 ...

在上面的代码中,我们首先定义了一个包含用户名、密码、主机、端口、数据库名和认证源的MongoDB URI。然后,我们检查这个URI是否已包含查询参数。根据检查结果,我们使用&?来添加directConnection=true参数。最后,我们打印出更新后的URI,并使用它来创建MongoClient实例,以便连接到MongoDB数据库。

总结

在Python中,为MongoDB URI添加额外的参数(如directConnection=true)是一个常见的需求。为了确保URI的格式正确,我们需要根据URI中是否已存在其他查询参数来决定使用&还是?来连接新参数。通过上面的示例代码,我们可以轻松地在已存在的URI中添加所需的参数,并使用更新后的URI来建立MongoDB连接。这样,我们就可以根据实际需求优化连接性能或解决特定问题了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/1083.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++智能指针(二十)

一.RAII(Resource Acquisition Is Initialization) RAII资源获取即初始化,RAII的思想就是在构造时初始化资源,或者托管已经构造的资源。在析构的时候释放资源。一般不允许复制或赋值,并且提供若干的资源访问的方法。比…

URL地址解析至页面展示全过程(面试详细解答)

目录 1、解析URL 2、缓存判断 ​编辑3、DNS解析 ​编辑4、获取MAC地址 5、TCP三次握手 6、HTTP请求 7、服务器处理请求,返回HTTP响应 8、页面渲染 9、TCP四次挥手 10、浏览器解析HTML 11、浏览器布局渲染 1、解析URL 首先会对 URL 进行解析,…

RS232、RS485、RS422、TTL、CAN各自的区别

目录 一:工业串口通信标准RS232、RS485、RS422的区别 第一个区别、硬件管脚接口定义不同 第二个区别、工作方式不同 第三个区别、通信方式不同 第四个区别,逻辑特性不同 第五个区别、抗干扰性、传输距离和传输速率也不同 二:RS232、RS…

CentOS 源码安装 Python3

今天在安装部分服务的时候,由于系统 CentOS 中默认带了 Python2,但是我的项目需要是 Python3 支持,特此将整个安装步骤记录下来。 安装必要的依赖 安装环境依赖 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlit…

docker安装并跑通QQ机器人实践(4)-bs-cqhttp搭建

go-cqhttp,基于 Mirai 以及 MiraiGo 的 OneBot Golang 原生实现,只需简单的配置, 就可以基于 go-cqhttp 使用框架开发,具有轻量, 原生, 高并发, 低占用, 跨平台等特点。 1 go-cqhttp 官网及可执行文件下载链接 go-cqhttp 官网:ht…

【Linux】详解进程通信中信号量的本质同步和互斥的概念临界资源和临界区的概念

一、同步和互斥的概念 1.1、同步 访问资源在安全的前提下,具有一定的顺序性,就叫做同步。在多道程序系统中,由于资源有限,进程或线程之间可能产生冲突。同步机制就是为了解决这些冲突,保证进程或线程之间能够按照既定…

泛型的初步认识(2)

前言~🥳🎉🎉🎉 hellohello~,大家好💕💕,这里是E绵绵呀✋✋ ,如果觉得这篇文章还不错的话还请点赞❤️❤️收藏💞 💞 关注💥&#x…

优思学院|ISO45001职业健康安全管理体系是什么?

ISO45001:2018是新公布的国际标准规范,全球备受期待的职业健康与安全国际标准(OH&S)于2018年公布,并将在全球范围内改变工作场所实践。ISO45001将取代OHSAS18001,成为全球工作场所健康与安全的参考。 ISO45001:201…

python应用

划分数据集 将数据集划分为训练集和测试集 import os import shutil import random # 数据集路径 images_dir ./images targets_dir ./gt # 划分后的路径 train_images_dir ./train/images test_images_dir ./test/images train_targets_dir ./train/gt test_ta…

微信域名防封/QQ域名防封/域名状态检测/域名防红防封API平台源码

下载地址:API平台源码 这套源码是使用thinkphp3.1.3开发的,可以在PHP5.3-5.6下运行,程序是有一点老了,但是思路仍在!然后,这套源码我已经成功搭建起来了,后台、个人(用户&#xff0…

在瑞芯微RV1126 Linux系统上调试WiFi的详细指南

目录标题 1. **系统和环境准备**2. **检查WiFi设备状态**3. **启用和禁用WiFi接口**4. **扫描可用的WiFi网络**5. **连接到WiFi网络**6. **查看当前的WiFi连接状态**7. **断开和重新连接WiFi**8. **管理WiFi网络配置**9. **使用iw工具进行高级WiFi调试**10. **故障排除和日志获…

算法训练营day16

一、二叉树的最大深度 递归解法 后序遍历(DFS) class Solution {public int maxDepth(TreeNode root) {if (root null) return 0;return Math.max(maxDepth(root.left), maxDepth(root.right)) 1;} }算法解析: 终止条件: 当 root 为空,…

力扣---填充每个节点的下一个右侧节点指针 II

给定一个二叉树: struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL 。 初始状态下,所有 next 指针都…

牛x之路 - Day1

Day1 微积分之屠龙宝刀(武林秘籍) 之前的一些东西都在pdf上记得笔记, 没有在这个上面展示一遍,只好学到相关内容的时候再提叙啦;所以其实再写这个小记的时候,我已经看了一半的书,但是不要紧&am…

nodejs npm 常用的命令

大家好,我是资深前端之路,以下是自己对npm命令的回顾梳理。喜欢的朋友记得点赞关注收藏哟! npm npm init :生成package.json文件。 npm -v:查看npm版本号。 npm i:下载对应的文件包。npm i 下载包名版本号,可以下载制定的版本…

IntelliJ IDEA运行发布传统Java Web Application项目

接 重温8年前项目部署 要求,如何改用IntelliJ IDEA运行发布传统 Java Web Application项目呢,简述步骤如下: 一、下载源码 源码:https://github.com/wysheng/kindergarten 下载后的本地项目路径:/Users/songjianyon…

《Python源码剖析》之对象的基石---PyObject

前言 在python的源代码中,PyObject的结构体定义如下,它的内容看起来很简单,只有3项,分别是:_PyObject_HEAD_EXTRA,ob_refcnt和ob_type,其中_PyObject_HEAD_EXTRA是用于指向活动堆的指针&#x…

学习大数据,所需要的linux基础(1)

文章目录 linux入门概述Linux和Windows的区别CentOS下载地址 Linux文件与目录结构Linux文件Linux目录结构 VI/VIM编辑器vi/vim是什么测试数据集准备一般模式编辑模式指令模式模式间转换 网络配置和系统管理操作查看网络IP和网关配置网络和ip地址ifconfig配置网络接口修改ip地址…

吉林教育报社投稿信箱投稿邮箱

吉林教育杂志社投稿信箱 产品说明 《吉林教育》 编辑在线咨询QQ:2648025923 编辑在线咨询QQ: 2958409081 编辑在线咨询QQ: 2734638650 编辑咨询电话:18366155179 编辑咨询电话:18366155179 吉林教育投稿信…

使用Python进行自动化测试

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 如何使用Python进行自动化测试:测试框架的选择与应用 自动化测试是软件开发过程…