首页

4.3项目开发过程

关灯 护眼    字体:

上一章 目录 下一章




4.3.1  生成初始数据


在项目的bin文件夹下有一个generate_data.py文件,文件中的代码如图4-14所示。

图4-14  generate_data.py文件中的代码

在本地启动  MongoDB,运行这个文件中的代码,则会在本地  MongoDB  中创建一个名为“chapter_4”的数据库,并在其中创建一个名为“people_info”的集合。初始状态会向集合中插入19条数据,如图4-15所示。

图4-15  初始数据

提示:

“初始数据生成程序生成”的人名、年龄和地址都是随机拼接的,因此每一位读者生成的初始数据都是不一样的。但可以确定的是,人名“小四”和“小六”中间没有“小五”。



4.3.2  实现“查询数据”功能


查询数据对应了DataBaseManager类里面的query_info()方法。在初始状态下,这个方法返回的是三条假数据,如图4-16所示。

图4-16  一开始query_info方法返回三条假数据

在图4-16中,方框框住的代码为:

现在的目标是,用  query_info()方法查询  MongoDB,并以列表的形式返回集合里面的所有数据。

由于无论是查询、增加、修改,还是删除数据,都会涉及数据库连接,因此,可以先在__init__()方法中创建数据库连接对象,这样在后面的其他方法中都能够直接使用,不需要多次初始化数据库连接。

1.创建数据库连接对象

修改__init__()方法中的代码,连接数据库并定位到people_info集合。见代码4-1。

代码4-1  构造函数

其中,主要代码说明如下。

●  第5行代码:创建MongoDB的连接。

●  第6行代码:指定使用“chapter_4”数据库。

●  第7行代码:指定使用“people_info”集合。

2.查询集合中所有“deleted”字段为0的信息

接下来完成query_info()方法,查询集合中所有“deleted”字段为0的信息。见代码4-2。

代码4-2  查询所有deleted为0的数据。

其中,主要代码说明如下。

●  第8行代码:“self.handler.find({'deleted':  0},{'_id':  0})”查询到所有deleted字段为0的数据,去掉ObjectId以后返回。再使用Python的list()方法把pymongo返回的对象转换为包含字典的列表。

●  第9行代码:将转换成的包含字典的列表返回。

完成以后的代码如图4-17所示。

图4-17  完善__init__()和query_info()方法

在虚拟环境中,使用“Ctrl+C”组合键关闭网站程序,然后再重新启动。刷新浏览器后可以看到,数据库中的信息已经成功显示在网页中了。

对比数据库中的数据可以发现,网页显示的内容与数据库中的内容是一致的,如图4-18所示。

图4-18  成功显示数据库中的数据



4.3.3  实现“添加数据”功能


添加数据的逻辑如下:

(1)如果people_info集合中没有数据,那么添加的人员工号为“1”。

(2)如果people_info中有数据,那么新的人员工号是“已有最大工号加1”。

(3)插入数据。

1.查询已有工号

首先需要查询people_info集合,寻找当前最大的工号。根据前面介绍的添加逻辑中的(1)和(2)两点,完善_query_last_id()方法,见代码4-3。

代码4-3  查询people_info寻找最大工号



其中,主要代码说明如下。

●  第10行代码:首先查询people_info集合,以“id”字段倒序排列,只取倒序排列以后的第1条数据,即id最大的那一条数据。

●  第11行代码:如果people_info不为空,那么if  last_info判断语句会执行if左边的语句,并且变量last_info可以像列表一样读取下标为0的元素,再读取这个元素的id,这就是当前最大的id了,读取以后返回。如果people_info集合是空的,那么if  last_info判断语句会执行else右边的语句,返回整数0。

2.添加新数据

add_info()方法首先调用_query_last_id()方法获得当前最大的id,然后把这个id加1作为新的id。再将新的id放到参数需要插入的字典“para_dict”中并插入数据库中。具体代码如下:

代码4-4  添加新数据

其中,主要代码说明如下。

●  第13、14行代码:获取当前最新id并加1。

●  第15行代码:把新的id添加到即将加入数据库的para_dict字典中。

●  第16~20行代码:把数据插入MongoDB中。为了防止在插入过程中出现问题,使用try…except  Exception把插入的代码“包”起来,这样可以在插入数据出错时把报错信息打印出来。

代码如图4-19所示。

图4-19  添加新数据的相关代码

3.测试添加数据

添加好数据之后,重新启动网站。

(1)刷新网页以后,添加一条新的人员信息并单击“添加”按钮,如图4-20所示。

图4-20  添加新的人员信息

(2)可以发现新的人员信息已经被添加成功,如图4-21所示。

图4-21  新的人员信息添加成功



4.3.4  实现“更新数据”功能


1.实现数据更新逻辑

更新数据的逻辑非常简单,根据工号id找到MongoDB中对应的记录并更新即可。涉及的代码如下。

代码4-5  更新数据

其中,主要代码说明如下。

●  第10行代码:根据id更新数据。para_dict的格式与添加新数据时的相同。

●  第11行代码:打印更新返回的对象。这是一行不重要的语句,可以省略。

●  第9行与第12行,使用try...except  Exception把更新代码“包”起来,这样遇到更新数据出错时就会把错误信息打印出来,并返回False。

完成以后的代码如图4-22所示。

图4-22  更新数据

2.测试更新数据

完成代码以后重启网站,刷新网页,尝试修改一条数据,修改完成以后单击“更新”按钮,如图4-23所示。

图4-23  修改部分信息

对比图4-21所示的数据可以发现数据已经发生了变化,如图4-24所示。

图4-24  数据已经发生了变化



4.3.5  实现“删除数据”功能


1.实现删除数据的逻辑

为了防止数据的误删除,使用“假删除”是一个简单有效的方法。在查询数据时,用到的查询条件为“deleted字段为0”,那么只要把deleted字段改为非0就可以让数据查不出来,也就变相实现了删除的功能。因此,删除数据的本质仍然是更新数据。

代码4-6  对数据进行假删除

其中,第7行代码调用了update_info()这个方法,传入了将要被删除的工号id。与前面更新用户信息不同,删除信息时只需要更新“deleted”字段,把该字段的值设为1。这样在数据查询阶段就无法查出数据了

改好以后的代码如图4-25所示。

图4-25  删除的本质是更新

2.测试删除数据的效果

修改好代码以后重启网站并刷新网页,单击工号为“12”的这个人员对应的“删除”按钮,如图4-26所示。

图4-26  单击“删除”按钮

删除数据以后,在网页上已经不能看到工号为“12”的这个人员的信息了。在数据库中,这个人员的deleted字段变成了1,如图4-27所示。

图4-27  删除人员信息

提示:

目前互联网上很多声称能够注销并删除账号的网站,几乎都是使用的假删除。虽然用户“注销”以后确实无法登录,但网站并不会删除用户的信息,只是通过修改数据库中的某个字段,让这个账号看起来像是被删除了而已。



本章小结


本章使用一个人员管理网站的实例来帮助读者巩固  MongoDB  的基本操作。整个过程使用基于  Python  的网络框架  Flask  来实现。读者只需要修改  your_code_here  文件夹下面的DataBaseManager.py中的相应方法,就可以用图形化的方式直观地看到代码的运行结果。

希望读者通过本章能明白,学习数据库绝对不能仅仅学习数据库本身的命令,一定要配合一门编程语言,这样才能掌握如何应用数据库。

没有任何一个项目是直接通过数据库自带的命令操作数据库来实现业务逻辑的,一定需要另外一门更加通用的语言来操作数据库。




上一章 目录 下一章