irpas技术客

Python使用pymongo库进行连接Mongodb数据库,设置数据库连接池等_唤醒手腕_pymongo连接池

网络 5139

关于Mongodb的使用,在我的Python全栈学习笔记专栏网络爬虫篇已经介绍过了,这边的话继续完整的整合下,增加新的知识点内容。

MongoDB是基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

MongoDB服务端可运行在Linux、Windows或mac os x平台,支持32位和64位应用,默认端口为27017。

推荐运行在64位平台,因为MongoDB在32位模式运行时支持的最大文件尺寸为2GB。

MongoDB 主要特点

MongoDB中的记录是一个文档,它是由字段和值对组成的数据结构。集合就是一组文档,类似于关系数据库中的表。

既然集合中可以存放任何类型的文档,那么为什么还需要使用多个集合?

这是因为所有文档都放在同一个集合中,无论对于开发者还是管理员,都很难对集合进行管理,而且这种情形下,对集合的查询等操作效率都不高。所以在实际使用中,往往将文档分类存放在不同的集合中。

MongoDB 实例可以承载多个数据库。它们之间可以看作相互独立,每个数据库都有独立的权限控制。在磁盘上,不同的数据库存放在不同的文件中。

MongoDB 中存在以下系统数据库:

Admin 数据库:一个权限数据库,如果创建用户的时候将该用户添加到admin 数据库中,那么该用户就自动继承了所有数据库的权限。

Local 数据库:这个数据库永远不会被复制,可以用来存储本地单台服务器的任意集合。

Config 数据库:当MongoDB使用分片模式时,config 数据库在内部使用,用于保存分片的信息。

用户权限介绍

3.1 Mongodb远程连接

想要进行远程的连接操作,首先要创建Mongodb的用户,展示如下所示:

创建用户

cd /www/server/mongodb/bin # mongo安装目录下的bin目录 mongo # 启动mongo服务,输入命令行mongo,进入mongodb环境 use admin # 切换到admin数据库 # 正常情况就会报错 Error: not authorized on admin # 先鉴权登录 db.auth('root', '此处是密码') db.createUser({user: "root",pwd:"root",roles:[{ role: "readWriteAnyDatabase" , db: "DBNAME" }] }) # 创建用户 db.createUser({user:"root",pwd:"123456",roles:["root"] }) # 第二种方式 # 成功结果如下: Successfully added user: { "user" : "root", "roles" : [ { "role" : "readWriteAnyDatabase", "db" : "admin" } ] } show users # 查看用户列表

远程联机宝塔centos系统的Mongodb数据库

进行权限的配置修改:

宝塔面板 和 服务器平台 都要开启27017的端口号 Mongodb结合Flask框架制作接口:

import pymongo from flask import Flask, make_response from bson import json_util app = Flask(__name__) app.MongoClient = pymongo.mongo_client.MongoClient("mongodb://root:root@服务器IP:27017") @app.route("/login") def index(): db = app.MongoClient["campus"] # 选择数据库库 collection = db.login # 选择集合 data = collection.find() # 查询数据 data_res = [] for item in data: data_res.append(item) res = make_response(json_util.dumps(data_res)) res.status = 200 res.headers['Content-Type'] = "application/json" return res if __name__ == '__main__': app.run(host="0.0.0.0", port=8080, debug=True)

Object of type ‘ObjectId’ is not JSON serializable 报错

从 mongo 中直接将查到的数据 dumps 导出,报错:

Object of type 'ObjectId' is not JSON serializable

解决方法:

from bson import json_util json_util.dumps(data)

修改Mongodb用户的密码

db.changeUserPassword("root","mongodbadmin"); 3.2 调用pymongo第三方库

PyMongo是驱动程序,使python程序能够使用Mongodb数据库,使用python编写而成。

先去官网下载软件包,地址点击打开链接,解压缩后进入,使用python setup.py install 进行安装或者用pip安装pip -m install pymongo 然后我们点击进入查看MongodbClient的源码:实例可以表示独立的MongoDB服务器、复制集或锐化集群。此类的实例负责维护集群的最新状态,并可能维护与此相关的缓存资源,包括用于监视的后台线程和连接池。(爱词霸翻译) 远程连接宝塔面板的Mongodb

import pymongo from datetime import datetime print(datetime.now()) # username="test" # password="test" # connection=pymongo.mongo_client.MongoClient(host="192.168.10.9:27017,connect=False,username=username,password=password) # 链接服务器, 是本地服务器可不需要传入参数 MongoClient = pymongo.mongo_client.MongoClient("mongodb://root:root@远程服务器IP:27017") # MongoClient = pymongo.MongoClient("mongodb://root:root@远程服务器IP:27017") # 获取数据库, 中括号中填入数据库中的名字 db = MongoClient["wrist"] collection = db.zhangyan res = collection.find() for item in res: print(item.get("name")) 3.3 pymongo插入数据

pymongo是Python中用来操作MongoDB的一个库,MongoDB是一个基于分布式文件存储的数据库,旨在为WEB应用提供可扩展的高性能数据存储解决方案。

其文件存储格式类似于JSON,叫BSON,通俗的理解,就是Python中的字典键值对格式,所以查询也需要根据键值对来。

特别注意:其文件存储格式只是类似于JSON,不是JSON,另外读出的数据不需要使用bson库进行转成对象,因为pymongo底层帮助我们转换成对象了。

只是在网络传输的过程中,需要传化成json字符串,那么需要我们要安装bson第三方库:pip install bson,来使特殊的dict对象进行转换成json字符串。

在Document中插入数据:

collection.insert_one({'name': '唤醒手腕', 'datetime': datetime.now()}) insert_many(list_of_dict) # 插入多个 3.4 pymongo查询数据(重要)

比较运算符 查找数据

符号说明$eq它将匹配等于指定值的值$ne它将匹配所有不等于指定值的值$gt它将匹配大于指定值的值$gte它将匹配所有大于或等于指定值的值$lt它将匹配所有小于指定值的值$lte它将匹配所有小于或等于指定值的值$in它将匹配数组中指定的任何值$nin它讲匹配不再数组中的值

比较运算符 查找数据,代码如下:

filterOption = { "age": {"$gte": 20} } # 查询年龄大于等于20岁的 data = collection.find_one(filterOption) print(data) # {'_id': ObjectId('61c7297dfff4db0a50af9f06'), 'name': '张燕', 'age': 20}

逻辑运算符查询

filterAnd = { '$and':[ {'fid': {'$eq': 2048}}, # filter_01 {'sid': {'$ne': 1024}} # filter_02 ] } filterOr = { '$or':[ {'fid': {'$eq': 2048}}, # filter_01 {'sid': {'$ne': 1024}} # filter_02 ] }

正则表达式查询

filterOption = { 'name': {'$regex': r'Tom [a-zA-Z]+'} }

遍历文档获取集合内所有文件:

# collection.find({}) # collection.find_one(filter) 只返回1个 for one in collection.find({}): print(one) 3.5 pymongo删除数据

删除的操作:

删除一个 collection.delete_one(filter)

删除多个 collection.delete_many(filter)

3.6 pymongo修改数据

修改的操作:

collection.update_many(filter, update)

新参量 update 说明:形式 {command: {key: value}}

$set 修改或新增字段$unset 删除指定字段$rename 重命名字段 # 修改或新增字段 filter = {'name': '马大师'} add_data = {'age': 60} # key name 存在,改其值为 马大师? update1 = {'$set': {'name': '马大师?'}} # key age 不存在,插入字段 update2 = {'$set': add_data} collection.update_one(filter, update1) collection.update_one(filter, update2) # 删除指定字段 filter = {'name': '马大师?'} del_data = {'age': 60} update = {'$unset': del_data} collection.update_one(filter, update) # 重命名字段 filter = {'name': '马大师?'} update = {'$rename': {'name': '名字'}} collection.update_one(filter, update)

断开连接:

client.close() 3.7 pymongo结合爬虫案例 import requests import json import pymongo headers = {'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'} data = requests.get("http://localhost:8080/person/words/all", headers=headers) words = json.loads(data.text) MongoClient = pymongo.mongo_client.MongoClient("mongodb://root:root@远程服务器IP:27017") db = MongoClient['wrist'] collection = db.word collection.insert_many(words)

pymongo客户端展示如下:


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #pymongo连接池 #由C语言编写 #OS