django1.11版本的extra函数有问题
最近在做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 里被修复了。
更多推荐
所有评论(0)