python:记工作中的一些在搜索引擎上不太好找到bug(二)

前言
  • 不定时更新
  • 选择记录的原因有以下两个:
    • 相关问题在搜索引擎上基本上搜索不到有效的答案。
    • 错误错的很有意义。
  • 文章中会有很少的代码片。(这是因为我所在的这家公司保密机制做的很严格,我需要尊重它)
  • 关于每个问题我重在记录和指导
  • 我会在每个问题的最后我会选择性的记录一些:你可能不知道,但是有必要知道的小知识点
第一个:使用查询语句的时候,得到了一个意想不到的效果。
  • 有下面两个model

    from django.db import models
    
    class Project(models.Model):
        project = models.CharField(max_length=128)
    
    
    class Change(models.Model):
        project = models.ForeignKey(Project, on_delete=models.CASCADE)
        se = models.CharField(max_length=128, null=True)
        date = models.DateTimeField()
    
  • 执行了下面的查询语句,得到了两个不同的结果

    In [92]: Project.objects.filter(Q(change__date__date__range=['2020-04-28','2020-04-28']),~Q(change__se__isnull=True)).count()
    Out[92]: 8
    
    In [93]: Project.objects.filter(Q(change__date__date__range=['2020-04-28','2020-04-28']),Q(change__se__isnull=False)).count()
    Out[93]: 9
    
  • 查看sql语句为:

    In [12]: str(Project.objects.filter(Q(change__date__date__range=['2020-04-28','2020-04-28']),~Q(change__se__isnull=True)).query)
    Out[12]: 'SELECT "app_project"."id", "app_project"."project" FROM "app_project" INNER JOIN "app_change" ON ("app_project"."id" = "app_change"."project_id") WHERE (django_datetime_cast_date("app_change"."date", \'UTC\', \'UTC\') BETWEEN 2020-04-28 AND 2020-04-28 AND NOT (
    "app_project"."id" IN (SELECT U0."id" FROM "app_project" U0 LEFT OUTER JOIN "app_change" U1 ON (U0."id" = U1."project_id") WHERE (U1."se" IS NULL AND U0."id" = "app_project"."id"))))'
    
    In [13]: str(Project.objects.filter(Q(change__date__date__range=['2020-04-28','2020-04-28']),Q(change__se__isnull=False)).query)
    Out[13]: 'SELECT "app_project"."id", "app_project"."project" FROM "app_project" INNER JOIN "app_change" ON ("app_project"."id" = "app_change"."project_id") WHERE (django_datetime_cast_date("app_change"."date", \'UTC\', \'UTC\') BETWEEN 2020-04-28 AND 2020-04-28 AND "app_
    change"."se" IS NOT NULL)'
    
    
  • 正确的结果应该是9。出这个错的原因是:~Q此时使用的是子查询,其中 ~ U1."se" IS NULL AND U0."id" = "app_project"."id" ~ 这个where条件是错误的(因为这样就导致了所有se为空的change 所关联的project__id 就是 project not in 的 id。假设存在一个project关联了两个change,其中有一个的se不为None,而这个project却被滤掉了),也就造成了查询出现异常的现象。

  • 补充
    1、所以说在日常的开发中,我们有时候是要看查询语句所执行的sql语句的哦。
    2、一般依赖多的条件查一的时候是要进行去重的,这里仅为测试便没做去重。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值