最近在做django版本的升级,由1.11升到3.2,在这一过程中,发现了一些奇诡的问题。

测试用例很简单,就是访问一些url,实际上就是去服务端访问数据库。

但是就是这么个测试,出问题了,跑不通了,问题是出到服务器侧,也不报错,就卡到那,最后过一个小时,服务器在没有新的访问的情况下,自动关闭,然后测试就拿到一个500的报错码。

查看具体的卡的点是这句代码:

 我在服务测加了一些打印:

可以发现name = '_currenttime' ,  d['select_sql'] = 'now()' , 然后很神奇的事就出现了,一定不能print 这个queryset,只要print queryset 就卡住,也不报错,也不抛异常,就卡那。我曾一度以为这个对象是不是没有东西,所以后来又加了个 values('id') 去查看其打印的内容,根据上图也看到了,它是有内容的,这一堆的id值。但是奇怪的是,我去查看这些id对应的数据,却发现数据为空,也就是没数据,但是extra却又硬生成了一些对象,但是对象又没数据,就是个奇诡的东西,不能用,一用就卡到那,不动了。

如图,查到的数据为空,但是我换个id就是有东西的。

 当 id = 1时,它有数据。所以,我的查询方式没问题,确实是 id = 27509, ... ,27528,都是没数据的。

然后我又尝试去打印 build_note 字段,这时候,就出问题了, 确实没数据,确实查不出来。然后大概5min,最后就得到一个查询超时,自动取消的一个结果。

 

 所以,django 1.11 这块,extra 函数应该在查不到数据的时候,就返回一个 <QuerySet []> 就好了,实在没必要非要弄出个东西出来。

这个问题在django 3.2 版本就得到了解决。

一样的没数据,就可以得到一个正常的结果,起码不会卡住。

所以这个问题就等于说在 django 3.2 里被修复了。

 

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐