Python使用pymongo库进行连接Mongodb数据库、设置数据库连接池等
关于Mongodb的使用,在我的Python全栈学习笔记专栏网络爬虫篇已经介绍过了,这边的话继续完整的整合下,增加新的知识点内容。MongoDB是基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。MongoDB服务端可运行在Linux、Wind
关于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 instal
l 进行安装或者用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客户端展示如下:
3.8 mongodump 备份工具
mongodump 能够在 Mongodb 运行时进行备份,它的工作原理是对运行的 Mongodb 做查询,然后将所有查到的文档写入磁盘。
mongodump的参数与mongoexport的参数基本一致。
mongodump关键参数如下所示:
mongodump --help 查看帮助命令
参数 | 解释 |
---|---|
-h, --host | 代表远程连接的数据库地址,默认连接本地Mongo数据库; |
–port | 代表远程连接的数据库的端口,默认连接的远程端口27017; |
-u, --username | 代表连接远程数据库的账号,如果设置数据库的认证,需要指定用户账号; |
-p, --password | 代表连接数据库的账号对应的密码; |
-d, --db | 代表连接的数据库; |
-c, --collection | 代表连接数据库中的集合; |
-o, --out | 代表导出的文件输出目录; |
-q, --query | 代表查询条件; |
-j, --numParallelCollections | 要并行转储的集合数(默认为4) |
–gzip | 使用Gzip压缩存档; |
–oplog | 使用oplog进行时间点快照; |
–authenticationDatabase | 指定用户鉴定库; |
全库备份
mongodump -u -p --port 27017 --authenticationDatabase admin -o /tmp/backup
备份指定的库,test库
mongodump -u -p --port 27017 --authenticationDatabase admin -d test -o /tmp/backup
备份test库下的customer集合
mongodump -u -p --port 27017 --authenticationDatabase admin -d test -c customer -o /tmp/backup
压缩备份单库
mongodump -u -p --port 27017 --authenticationDatabase admin -d test -o /tmp/backup --gzip
压缩备份单表
mongodump -u -p --port 27017 --authenticationDatabase admin -d test -c customer -o /tmp/backup --gzip
单库恢复
mongorestore -u -p --port 27017 --authenticationDatabase admin -d test /tmp/backup/test
恢复test库下的customer集合
mongorestore -u -p --port 27017 --authenticationDatabase admin -d test -c customer /tmp/backup/test/customer.bson
注意点:恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,备份后添加修改的数据都会被删除,谨慎使用!
恢复单库
mongorestore -u -p --port 28018 --authenticationDatabase admin -d test --drop /tmp/backup/test
恢复单表
mongorestore -u -p --port 28018 --authenticationDatabase admin -d test -c customer --drop /tmp/backup/test/customer.bson
更多推荐
所有评论(0)