PyMongo + Mongo 连接 “哎” 到底怎么连

2020-05-18 15:20:55 浏览数 (1)

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 如果是单机,但有用户名密码怎么办

代码语言:javascript复制
#!/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 为大多数,并且如果读趋向于从库

代码语言:javascript复制
代码语言:javascript复制
代码语言:javascript复制
代码语言:javascript复制
#!/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/

0 人点赞