读书人

近日做金额校验的自动化运用到Django的

发布时间: 2012-11-23 22:54:33 作者: rapoo

近期做金额校验的自动化运用到Django的Model层
近期做金额校验的自动化运用到Django的Model层,把一些经过记录一下

好处:

数据库结构可以在一个文件中维护

省去了管理连接游标的问题

不用写一大长串的sql了

如何安装Python和Django不再此描述

从安装后开始说

第一步

创建一个Django项目用于做自动化测试

配置好数据库,我们使用的是Oracle

所以在settings里配置为oracle

近日做金额校验的自动化运用到Django的Model层

第二步

将现有的数据库结构导入到项目中来

运行Django的命令'manage.py inspectdb'(这个命令的作用就是把数据库里的结构生成Django的model类)

运行后会在终端打印出来,保存到本地的txt文件吧

可以看到生成的每一个类对应一张表

类里的每一个变量对应表的每一个字段,类型,外键等等

近日做金额校验的自动化运用到Django的Model层

第三步

修改导出的model类

1.排序,把外键的类放在前面

近日做金额校验的自动化运用到Django的Model层

如图所示,就是BApplyInfo这个类必须在当前这个RepaymentStatistics类前面(RepaymentStatistics表存在一个外键,对应BApplyInfo这张表的apply_id)

这里说明一下,apply = models.ForeignKey(BApplyInfo, null=True, blank=True)

看这句 model类默认把这种'XXX_ID'命名方式的外键自动去掉了'_ID',如果不幸你的外键不是这样命名的,没关系加上db_column就行了(就叫他别名吧)

如图

近日做金额校验的自动化运用到Django的Model层

2.每张表都必须有主键,这个要每张表手动添加了,比如上面那张表comp_ret_id = models.IntegerField(primary_key=True, unique=True)

需要我们自己添加'primary_key=True,'这几个字母

最后这个只存在数据库结构的全都是models的模块就编写完成了

近日做金额校验的自动化运用到Django的Model层

以后如果数据库增加或者删除了表或者表的字段,在这里添加或删除类或者类里的变量就可以了哦

下满开始写真正的读取脚本

第四步

编写读取的脚本

比如我们这个网站

基本描述结构就用,用户注册表、用户信息表、订单表、购物车表、还款表等等几十张表

一切的起点都是用户注册的那个邮箱,我们需要编写一个类,根据输入的邮箱,就可以获取到用户所有的信息

这里用于演示,没有再编写类,只是在另一个module里直接使用刚才生成的model类

RepaymentPlan = p2pdb.RepaymentPlan.objects.order_by('plan_id').filter(apply__ib_amt_apply__i_borrow__i_user__s_email='snowshine_2001@yahoo.com.cn')    for item in RepaymentPlan:        print '还款id:%s 预期罚息:%s 实际罚息:%s' % (item.plan_id, item.plan_pay_penalty, item.actual_pay_penalty)

这里解释一下这句话的意思:

还款表的外键关联申请明细表,申请表的外键关联申请统计表,申请统表的外键关联用户信息表,用户信息表的外键管理用户注册表,最后根据用户注册表的邮箱,就查到了想要的东西,这里利用ORM的特性,没有写传统意义上的SQL语句,也没有去管理数据库的连接,最终的运行结果如下:

近日做金额校验的自动化运用到Django的Model层

filter()后面那一大串里,每个'__'代表使用了一次外键,这里应该是用了N层外键,最后终于连接到用户注册表的邮箱

关于如何使用排序,无关大小的LIKE = 包含等等,请查阅Django相关资料

大概说几个:

__exact 精确等于 like 'aaa'
__iexact 精确等于 忽略大小写 ilike 'aaa'
__contains 包含 like '%aaa%'
__icontains 包含 忽略大小写 ilike '%aaa%'

下面看一下用标准的SQL语句查询

近日做金额校验的自动化运用到Django的Model层

OK,是不是很神奇,其实Django默默的帮你做了这些工作,它也是把你的想法转变成了SQL语句去执行

看下面这个截图,使用数据库的dba用户登录,查看sql视图,可以看到刚才Django做了什么查询

近日做金额校验的自动化运用到Django的Model层

看到django使用的语句了吧 里面一样也是inner join 不过可以发现django默认是把表所有列的数据都取出来?相当于select t.*

可以看到Django使用的是绑定变量的方式查询的,而不是上一张图的传值方式查询,这样的好处是减少oracle对sql语句的硬解析,可以提高查询速度,当然这是题外话了

第五步

开始验证各种数据吧(其实这里才是真正头疼的,各种金额加来加去,对比来对比去...不过写完后,回归真的很有效果)

最后,我们就可以随心所欲的取到数据库里的值了,然后进行各种运算的验证吧

这里是一个计算公式和数据库里的值对比是否相等的验证

有指数乘方运算,还有decimal和float之间的运算等

近日做金额校验的自动化运用到Django的Model层

很多表的金额都要做验证

近日做金额校验的自动化运用到Django的Model层

也是边测边写的,现在在做回归验证,效果还是很不错的,把之前手动测试发现的BUG也加到了验证步骤里用于回归

近日做金额校验的自动化运用到Django的Model层

总之,Django在这次测试过程中表现还是很棒的,毕竟维护结构化的类表,总比维护一大堆SQL语句舒服多了,而且还省去了oralce connect的管理

而且外键的语句看上去更加清晰

读书人网 >其他数据库

热点推荐