2.4 使用MongoDB数据库
MongoDB是一个基于分布式文件存储的数据库,由 C++语言编写,旨在为 Web应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。在本节的内容中,将详细讲解在Python程序中使用MongoDB数据库的知识。
2.4.1 搭建MongoDB环境
(1)在MongoDB官网中提供了可用于32位和64位系统的预编译二进制包,读者可以从MongoDB官网下载安装包,下载地址是https://www.mongodb.com/download-center#enterprise。如图2-15所示。
图2-15 MongoDB下载页面
(2)根据当前计算机的操作系统选择下载安装包,因为笔者是64位的Windows系统,所以选择“Windows x64”,然后单击“Download”按钮。在弹出的界面中选择“msi”,如图2-16所示。
(3)下载完成后得到一个“.msi”格式文件,鼠标双击这个文件,然后按照操作提示进行安装即可。安装界面如图2-17所示。
图2-16 选择“msi” 图2-17 安装界面
2.4.2 在Python程序中使用MongoDB数据库
在Python程序中使用MongoDB数据库时,必须首先确保安装了pymongo这个第三方库。如果下载的是“exe”格式的安装文件,则可以直接运行安装。如果是压缩包的安装文件,可以使用以下命令进行安装:
pip install pymongo
如果没有下载安装文件,可以通过如下命令进行在线安装。
easy_install pymongo
安装完成后的界面效果如图2-18所示。
图2-18 安装完成后的界面效果
例如在下面的实例文件mdb.py中,演示了在Python程序中使用MongoDB数据库的过程。
源码路径:codes\2\2-4\mdb.py
from pymongo import MongoClient
import random
…省略部分代码…
if __name__ == '__main__':
print("建立连接...") #打印提示信息
stus = MongoClient().test.stu #建立连接
print('插入一条记录...') #打印提示信息
#向表stu中插入一条数据
stus.insert({'name':get_str(2,4),'passwd':get_str(8,12)})
print("显示所有记录...") #打印提示信息
stu = stus.find_one() #获取数据库信息
print(stu) #显示数据库中的数据信息
print('批量插入多条记录...') #打印提示信息
stus.insert(get_data_list(3)) #向表stu中插入多条数据
print('显示所有记录...') #打印提示信息
for stu in stus.find(): #遍历数据信息
print(stu) #显示数据库中的数据信息
print('更新一条记录...') #打印提示信息
name = input('请输入记录的name:')#提示输入要修改的数据
#修改表stu中的一条数据
stus.update({'name':name},{'$set':{'name':'langchao'}})
print('显示所有记录...') #打印提示信息
for stu in stus.find(): #遍历数据
print(stu) #显示数据库中的数据信息
print('删除一条记录...') #打印提示信息
name = input('请输入记录的name:')#提示输入要删除的数据
stus.remove({'name':name}) #删除表中的数据
print('显示所有记录...') #打印提示信息
for stu in stus.find(): #遍历数据信息
print(stu) #显示数据库中的数据信息
在上述实例代码中使用两个函数生成字符串的。在主程序中首先连接集合,然后使用集合对象的方法对集合中的文档进行插入、更新和删除操作。每当数据被修改后,会显示集合中所有文档,以验证操作结果的正确性。
在运行本实例时,初学者很容易遇到如下Mongo运行错误:
Failed to connect 127.0.0.1:27017,reason:errno:10061由于目标计算机积极拒绝,无法连接…
发生上述错误的原因是没有开启MongoDB服务,下面是开启MongoDB服务的命令:
mongod --dbpath "h:\data"
在上述命令中,“h:\data”是一个保存MongoDB数据库数据的目录,读者可以随意在本地计算机硬盘中创建,并且还可以自定义目录名字。在CMD控制台界面中,开启MongoDB服务成功时的界面效果如图2-19所示。
图2-19 开启MongoDB服务成功时的界面
在运行本实例程序时,必须在CMD控制台中启动MongoDB服务,并且确保上述控制台界面处于打开状态。本实例执行后会输出:
建立连接...
插入一条记录...
显示所有记录...
{'_id': ObjectId('586243795cd071f570ed3b39'), 'name': 'vvtj', 'passwd': 'iigbddauwj'}
批量插入多条记录...
显示所有记录...
{'_id': ObjectId('586243795cd071f570ed3b39'), 'name': 'vvtj', 'passwd': 'iigbddauwj'}
{'_id': ObjectId('5862437a5cd071f570ed3b3a'), 'name': 'nh', 'passwd': 'upyufzknzgdc'}
{'_id': ObjectId('5862437a5cd071f570ed3b3b'), 'name': 'rgf', 'passwd': 'iqdlyjhztq'}
{'_id': ObjectId('5862437a5cd071f570ed3b3c'), 'name': 'dh', 'passwd': 'rgupzruqb'}
{'_id': ObjectId('586243e45cd071f570ed3b3e'), 'name': 'hcq', 'passwd': 'chiwwvxs'}
{'_id': ObjectId('586243e45cd071f570ed3b3f'), 'name': 'yrp', 'passwd': 'kiocdmeerneb'}
{'_id': ObjectId('586243e45cd071f570ed3b40'), 'name': 'hu', 'passwd': 'pknqgfnm'}
{'_id': ObjectId('5862440d5cd071f570ed3b43'), 'name': 'tlh', 'passwd': 'cikouuladgqn'}
{'_id': ObjectId('5862440d5cd071f570ed3b44'), 'name': 'qxf', 'passwd': 'jlsealrqeeel'}
{'_id': ObjectId('5862440d5cd071f570ed3b45'), 'name': 'vlzp', 'passwd': 'wolypmej'}
{'_id': ObjectId('58632e6c5cd07155543cc27a'), 'sid': 2, 'name': 'sgu', 'passwd': 'ogzvdq'}
{'_id': ObjectId('58632e6c5cd07155543cc27b'), 'sid': 3, 'name': 'jiyl', 'passwd': 'atgmhmxr'}
{'_id': ObjectId('58632e6c5cd07155543cc27c'), 'sid': 4, 'name': 'dbb', 'passwd': 'wmwoeua'}
{'_id': ObjectId('5863305b5cd07155543cc27d'), 'sid': 27, 'name': 'langchao', 'passwd': '123123'}
{'_id': ObjectId('5863305b5cd07155543cc27e'), 'sid': 28, 'name': 'oxp', 'passwd': 'acgjph'}
{'_id': ObjectId('5863305b5cd07155543cc27f'), 'sid': 29, 'name': 'sukj', 'passwd': 'hjtcjf'}
{'_id': ObjectId('5863305b5cd07155543cc280'), 'sid': 30, 'name': 'bf', 'passwd': 'cqerluvk'}
{'_id': ObjectId('5988087533fda81adc0d332f'), 'name': 'hg', 'passwd': 'gmflqxfaxxnv'}
{'_id': ObjectId('5988087533fda81adc0d3330'), 'name': 'ojb', 'passwd': 'rgxodvkprm'}
{'_id': ObjectId('5988087533fda81adc0d3331'), 'name': 'gtdj', 'passwd': 'zigavkysc'}
{'_id': ObjectId('5988087533fda81adc0d3332'), 'name': 'smgt', 'passwd': 'sizvlhdll'}
{'_id': ObjectId('5a33c1cb33fda859b82399d0'), 'name': 'dbu', 'passwd': 'ypdxtqjjafsm'}
{'_id': ObjectId('5a33c1cb33fda859b82399d1'), 'name': 'qg', 'passwd': 'frnoypez'}
{'_id': ObjectId('5a33c1cb33fda859b82399d2'), 'name': 'ky', 'passwd': 'jvzjtcfs'}
{'_id': ObjectId('5a33c1cb33fda859b82399d3'), 'name': 'glnt', 'passwd': 'ejrerztki'}
更新一条记录...
请输入记录的name: