You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django 1.7原生查询遇Schema不存在错误,求条件Count实现方案

解决Django 1.7原生查询中条件Count的Schema错误问题

嘿,我看你在Django 1.7里尝试用原生SQL实现带条件的Count功能,结果碰到了ProgrammingError: schema "point_substanceexistslabel" does not exist的错误,这问题其实是SQL语句里的两个小失误导致的,咱们来一步步修正:

错误原因分析

  • 表名拼写错误:你在CASE判断里写的是"point_substanceexistslabel"."substance"."name",但后面JOIN的表明明是points_substanceexistslabel(多了个s),数据库找不到少了s的表,就误以为它是个schema了。
  • 字符串未用单引号包裹:"fabric"用双引号的话,数据库会把它当成标识符(比如列名或schema),而不是字符串值,这也可能引发额外的错误。

修正后的原生SQL代码

把这两个问题修正后,你的查询应该就能正常运行了:

a = Photo.objects.raw('''
    SELECT "photos_photo"."id",
           COUNT(DISTINCT CASE WHEN "points_substanceexistslabel"."substance"."name" = 'fabric' THEN 1 ELSE NULL END) AS c
    FROM "photos_photo"
    LEFT OUTER JOIN "points_substanceexistslabel"
        ON ("photos_photo"."id" = "points_substanceexistslabel"."photo_id")
    GROUP BY "photos_photo"."id"
''')

额外建议:用Django的extra()替代纯原生SQL

考虑到Django 1.7不支持annotate的filter参数,你可以用extra()方法来实现相同功能,这样更贴合Django的ORM风格,也能减少手动写SQL的失误:

photos = Photo.objects.extra(
    select={
        'c': '''
            COUNT(DISTINCT CASE WHEN points_substanceexistslabel.substance.name = 'fabric' THEN 1 ELSE NULL END)
        '''
    },
    tables=['points_substanceexistslabel'],
    where=['photos_photo.id = points_substanceexistslabel.photo_id'],
    group_by=['photos_photo.id']
)

这样你就能像操作普通QuerySet一样处理结果,不用直接处理raw query返回的对象。

内容的提问来源于stack exchange,提问作者Mitchell van Zuylen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:16:48