绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
PyMongo + Mongo 连接 “哎” 到底怎么连
2020-02-05 18:12:10

NO SQL 的产品在操作方面虽然有很多 GUI 的工具,或者让人熟悉的命令行,但这些数据库软件的操作,如果有程序语言的加入则会变得要方便的多,Mongodb 如果使用一些语言,例如JAVASCRIPT 在内部操作很多事情将变得简单。通用的语言python 在操作数据库方面已经是很成熟的东西,连接mongodb 的python的方法也很多。

今天想正规以下如何使用pymongo来连接mongo 各种的形态做一个总结。

其中也发现了网上(中文)关于这方面的一个问题。很少有讲的或讲清楚的。


首先为什么要使用PYMONGO,主要的原因是他是官方推出的PYTHON API,怎么安装pymongo这与python有关,这里有一个事情就是安装pymongo 也是可以选择版本的, 需要根据你的生产环境安装的pymongo的版本,来对应你的变成的环境。



虽然小版本的不同不会造成什么困扰,但好还是要统一的python for mongodb api 的版本。



上面使用了python3 ,并且使用了pymongo API 连接 mongodb的两种的格式,但这样的使用方式与实际相差甚远,属于模型和实体之间的差别,WHY


1 你的MONGODB 如果是单机,难道没有用户名密码

2 你的MONGODB  如果不是单机,是复制集怎么连接,怎么read prefer which one ,有没有线程池,等等问题


1 如果是单机,但有用户名密码怎么办


#!/usr/bin/python3
# -*- coding: utf-8 -*-
import pymongo
import datetime
from pymongo import MongoClient

client = MongoClient('mongodb://admin:1234.com@192.168.198.56:27087/admin')

print (client)

那么使用pymongo 中的 mongoclient 使用MONGODB 标准的连接方式放到括号并用单引号标注就可以成功连接了


但大部分连接MONGODB的时候是复制集,这也是出问题多的地方,网上大部分的要不不介绍,要不就还用mongoClient 继续伪装连接 mongodb的复制集中的某台机器。


上图虽然可以连接并可以操作mongodb 的复制集但实际上离实际上的真正灵活的操作复制集还差的远。


1  连接没有验证是否成功,这里不是上面的连接不报错,就说明连接成功了,恰恰是错误,报错会在你实体操作MONGODB 的时候,才能反映出来。这就说明,我们在连接MONGODB 的时候,必须要进行一个判断。按理说pymongo 连接如果情况异常是应该产生一些错误的。


为什么从3.0版本开始,MongoClient构造函数在连接服务器时不再阻塞,如果它们不可用,它也不再引发ConnectionFailure,如果用户的凭证错误,它也不再引发配置错误。



首先上面的连接格式是mongodb 3.6后提出的 DNS seedlist connection format, 使用+srv连接字符串修饰符自动将连接的tls(或等效ssl)选项设置为true。您可以通过在查询字符串中显式地将tls(或等效的ssl)选项设置为false(或ssl=false)来覆盖此行为。


那么问题来了按照标准的写法,如果我不想按照PYMONGO 默认的设置,连接尝试20秒尝试后,在返回可以连接不可以连接,这样的如果是失败的连接我就要等待20秒,这显然是不OK 的,


下面的写法可以将复制集以及连接错误返回的速度调整到0.3秒

另外还有一些其他的参数可以添加进来


例如我想设置一个连接池大连接10个 小 保留2个连接  不使用 SSL 连接方式,并且读的concernLevel 为大多数,并且如果读趋向于从库

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import pymongo
import datetime
from pymongo import MongoClient
from pymongo.errors import ConnectionFailure
client = MongoClient('mongodb://root:1234.Com@192.168.198.56:27027,192.168.198.56:27037,192.168.198.56:27047/'
'?replicaSet=repl&authSource=admin&connectTimeoutMS=300&ssl=false&minPoolSize=2&maxPoolSize=10'
'&readConcernLevel=majority&readPreference=secondary')

try:
client.admin.command('ismaster')
print ("connect ok")

except ConnectionFailure:

print("can't connect mongodb.")


下图是读的导向的几种方式


所以pymongo 连接单机,复制集中以上的介绍基本上够用,如果还想在进一步了解一些其他的参数,可以访问下面的官方网站

https://docs.mongodb.com/manual/reference/connection-string/




分享好友

分享这个小栈给你的朋友们,一起进步吧。

数据库杂货铺
创建时间:2021-12-10 09:57:47
分享数据库管理,运维,源代码 ,业界感受, 吐槽
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • liuaustin
    栈主

小栈成员

查看更多
  • miemieMIA
  • 578154454
  • ylfxml
戳我,来吐槽~