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
相关产品推荐
相关产品推荐

